CakePHP访问间接相关的模型 - 初学者的问题

时间:2010-04-24 21:11:48

标签: cakephp views associations

我正在编写一个CakePHP应用程序来记录我为各种客户所做的工作,但经过几天的努力,我似乎​​无法让它做我想做的事情。我已经阅读了CakePHP网站的大部分内容。

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

每个“日志项目”都属于“子项目”,而子项目又属于“项目”,而“项目”又属于最终属于客户的“子客户”。这些是我正在使用的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

使用'cake bake'我创建了模型,控制器(索引,视图添加,编辑和删除)和视图,似乎功能正常 - 就像我能够成功执行简单的CRUD操作一样。

问题

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

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

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

我找到了这个例子:

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

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

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

亲切的问候,

克里斯

1 个答案:

答案 0 :(得分:0)

您的外键名称应该是单数。所以projects_id应该是project_id,sub_projects_id应该是sub_project_id,依此类推。如果您使用蛋糕烘焙或脚手架,则无法在每个模型编辑页面中编辑关联数据。作为旁注,请确保您创建的所有模型类都是单一的(在/ models /文件夹中)。

要编辑多个关联级别,可能就像在每个模型中将$ recursive类成员设置为2一样简单,您希望编辑页面具有多个关联级别。让我知道这对你有用。

回应你的第二个问题。

确保您的模型具有所有正确的关联。如果你把它们烤好,它们应该包括它们,但鉴于你的错误,看起来它们似乎不包括在内。所以在log_item.php中你应该有类似

的东西

var $belongsTo = array('SubProject');