【问题标题】:CakePHP access indirectly related model - beginner's questionCakePHP 访问间接相关模型 - 初学者的问题
【发布时间】:2010-04-30 22:28:49
【问题描述】:

我正在编写一个 CakePHP 应用程序来记录我为各种客户所做的工作,但经过几天的尝试,我似乎无法让它完成我想要的工作。我已经阅读了 CakePHP 网站上的大部分书籍。

并搜索了我所有的价值,所以我认为我错过了一些明显的东西!

每个“日志项”都属于一个“子项目”,该子项目又属于一个“项目”,该项目又属于一个“子客户端”,最终属于一个客户端。这些是我正在使用的 5 个 MySQL 表:

mysql> DESCRIBE log_items;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| date            | date         | NO   |     | NULL    |                |
| time            | time         | NO   |     | NULL    |                |
| time_spent      | int(11)      | NO   |     | NULL    |                |
| sub_projects_id | int(11)      | NO   | MUL | NULL    |                |
| title           | varchar(100) | NO   |     | NULL    |                |
| description     | text         | YES  |     | NULL    |                |
| created         | datetime     | YES  |     | NULL    |                |
| modified        | datetime     | YES  |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE sub_projects;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name        | varchar(100) | NO   |     | NULL    |                |
| projects_id | int(11)      | NO   | MUL | NULL    |                |
| created     | datetime     | YES  |     | NULL    |                |
| modified    | datetime     | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE projects;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| name           | varchar(100) | NO   |     | NULL    |                |
| sub_clients_id | int(11)      | NO   | MUL | NULL    |                |
| created        | datetime     | YES  |     | NULL    |                |
| modified       | datetime     | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE sub_clients;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(100) | NO   |     | NULL    |                |
| clients_id | int(11)      | NO   | MUL | NULL    |                |
| created    | datetime     | YES  |     | NULL    |                |
| modified   | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+


mysql> DESCRIBE clients;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment |
| name     | varchar(100) | NO   |     | NULL    |                |
| created  | datetime     | YES  |     | NULL    |                |
| modified | datetime     | YES  |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

我在 CakePHP 中设置了以下关联:

LogItem belongsTo SubProjects
SubProject belongsTo Projects
Project belongsTo SubClients
SubClient belongsTo Clients

Client hasMany SubClients
SubClient hasMany Projects
Project hasMany SubProjects
SubProject hasMany LogItems

使用“蛋糕烘焙”,我创建了模型、控制器(索引、视图添加、编辑和删除)和视图,并且一切似乎都可以正常工作 - 因为我能够成功执行简单的 CRUD 操作。

问题

在 www.mydomain/log_items/edit 上编辑“日志项”时,我看到的视图是你们都会怀疑的;即带有适当文本字段/选择框等的 log_items 表的列。我还想合并选择框以在“log_items”编辑视图中选择客户端、子客户端、项目和子项目。

理想情况下,“子客户端”选择框应根据选择的“客户端”自行填充,“项目”选择框也应根据选择的“子客户端”等自行填充,等等。

我想用相关选项填充选择框的方法是 Ajax,但我不确定如何从间接相关模型的子视图实际访问模型,例如如何创建一个 ' 'log_items' 编辑视图中的 sub-client' 选择框。

我找到了这个例子:

http://forum.phpsitesolutions.com/php-frameworks/cakephp/ajax-cakephp-dynamically-populate-html-select-dropdown-box-t29.html

某人在美国各州、县和市取得了类似的成就。但是,我在数据库模式中注意到 - 可以从上面的链接网站下载 - 数据库表没有任何外键,所以现在我想知道我是否以正确的方式处理事情。

非常感谢任何指针和建议。

亲切的问候,

克里斯

【问题讨论】:

    标签: cakephp views associations


    【解决方案1】:

    您的外键名称应该是单数。所以 projects_id 应该是 project_id 并且 sub_projects_id 应该是 sub_project_id 等等。如果您使用的是蛋糕烘焙或脚手架,您应该无法在每个模型编辑页面中编辑相关数据。附带说明一下,确保您创建的所有模型类都是单数的(在 /models/ 文件夹中)。

    要编辑多级关联,只需在您希望编辑页面具有多级关联的每个模型中将 $recursive 类成员设置为 2 即可。让我知道这对你有什么影响。

    针对您的第二个问题。

    确保您的模型具有所有正确的关联。如果您烘烤它们,它们应该包括它们,但考虑到您的错误,它们看起来好像不包括在内。所以在 log_item.php 你应该有类似的东西

    var $belongsTo = array('SubProject');

    【讨论】:

      猜你喜欢
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-13
      • 2011-06-04
      • 2011-01-12
      • 2018-01-08
      • 2021-04-26
      相关资源
      最近更新 更多