Я испек старое приложение, используя 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
из каждой таблицы) в иерархическом формате (Правила -> Группы -> Фильтры).