CakePHP 3-未定义关联-即使它看起来是

CakePHP 3-未定义关联-即使它看起来是,php,cakephp-3.0,cakephp-3.x,Php,Cakephp 3.0,Cakephp 3.x,我已经使用CakePHP3.7烘焙了一个遗留应用程序 该数据库包含以下3个表:法规,组,过滤器。应用程序的层次结构是: 规定 团体 过滤器 表架构如下所示: mysql> describe regulations; +-------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra

我已经使用CakePHP3.7烘焙了一个遗留应用程序

该数据库包含以下3个表:
法规
过滤器
。应用程序的层次结构是:

  • 规定
    • 团体
      • 过滤器
表架构如下所示:

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()
方法中:

// 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);
它给出了一个错误:

法规中未定义过滤器协会

嗯,很明显。因为它的关联是通过Groups(
GroupsTable.php
)模型处理的。过滤器和法规之间没有直接关系;它必须通过小组进行

请有人告诉我烘焙模型有什么问题,这样就不会产生错误了


背景信息:用例以分层格式(规则-->组-->过滤器)获取数据列表(特别是每个表中的
标签

模型很好,您正在寻找包含嵌套关联的@ndm,谢谢。这不是我在使用
->contain(…)
时所做的吗?不,您在同一级别上传递关联,您需要以嵌套方式定义它们,如示例2到4所示。模型很好,您正在寻找包含嵌套关联的@ndm,谢谢。这不是我对
->contain(…)
所做的吗?不,您在同一级别上传递关联,您需要以嵌套方式定义它们,如示例2到4所示。