CakePHP 3 - association is not defined - even though it appears to be

倾然丶 夕夏残阳落幕 提交于 2019-12-13 19:36:24

问题


I've baked a legacy application using CakePHP 3.7

The database contains 3 tables as follows: regulations, groups, filters. The hierarchy as far as the application goes is:

  • Regulations
    • Groups
      • Filters

The table schemas are as follows:

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    |                |
+----------+----------------------+------+-----+---------+----------------+

So when I baked the application I got the following Table class relationships. All are inside the 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'
    ]);

In my mind this seems correct because those are the relationships as far as the schema goes.

However, when I try and do this in a Controller:

$regulations = TableRegistry::getTableLocator()->get('Regulations');
$data = $regulations->find('all')->contain(['Groups', 'Filters']);
$data = $data->toArray();
debug($data);

It's giving an error:

The Filters association is not defined on Regulations.

Well, obviously. Because the association for that is handled through the Groups (GroupsTable.php) model. There is no direct relationship between Filters and Regulations; it must go via Groups.

Please can someone advise what is wrong with the baked Models so that this won't produce an error?

For background info: the use case is getting a list of the data (specifically the label from each table) in a hierarchical format (Regulations --> Groups --> Filters).

来源:https://stackoverflow.com/questions/56563186/cakephp-3-association-is-not-defined-even-though-it-appears-to-be

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!