我使用 CakePHP 3.7 烘焙了一个遗留应用程序
数据库包含3张表,如下:regulations
, groups
, filters
。就应用程序而言,层次结构是:
表架构如下:
mysql> describe regulations;
+-------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| label | varchar(255) | NO | | NULL | |
+-------+---------------------+------+-----+---------+----------------+
4 rows in set (0.09 sec)
mysql> describe groups;
+---------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------+------+-----+---------+----------------+
| id | int(4) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| regulation_id | int(4) unsigned | NO | MUL | NULL | |
| label | varchar(255) | NO | | NULL | |
+---------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.03 sec)
mysql> describe filters;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| label | text | NO | | NULL | |
| group_id | int(4) unsigned | NO | MUL | NULL | |
+----------+----------------------+------+-----+---------+----------------+
因此,当我烘焙应用程序时,我得到了以下表类关系。全部都在里面initialize()
method:
// RegulationsTable.php
$this->hasMany('Groups', [
'foreignKey' => 'regulation_id'
]);
// GroupsTable.php
$this->belongsTo('Regulations', [
'foreignKey' => 'regulation_id',
'joinType' => 'INNER'
]);
$this->hasMany('Filters', [
'foreignKey' => 'group_id'
]);
// FiltersTable.php
$this->belongsTo('Groups', [
'foreignKey' => 'group_id',
'joinType' => 'INNER'
]);
在我看来,这似乎是正确的,因为就架构而言,这些是关系。
但是,当我尝试在控制器中执行此操作时:
$regulations = TableRegistry::getTableLocator()->get('Regulations');
$data = $regulations->find('all')->contain(['Groups', 'Filters']);
$data = $data->toArray();
debug($data);
它给出了一个错误:
法规中没有定义过滤器协会。
嗯,显然。因为其关联是通过组处理的(GroupsTable.php
) 模型。没有direct过滤器和调节器之间的关系;它必须通过组进行。
请有人建议烘焙模型有什么问题,这样就不会产生错误?
对于背景信息:用例是获取数据列表(特别是label
来自每个表)以分层格式(法规-->组-->过滤器)。