CakePHP 3 - ассоциация не определена - даже если она - PullRequest
1 голос
/ 12 июня 2019

Я испек старое приложение, используя 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() метода:

// 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).Не существует прямой взаимосвязи между фильтрами и правилами;он должен проходить через группы.

Может кто-нибудь посоветует, что не так с запеченными моделями, чтобы это не приводило к ошибке?

Для справочной информации: сценарий использования получает список данных (в частности, label из каждой таблицы) в иерархическом формате (Правила -> Группы -> Фильтры).

...