Cake PHP 3.5.13
У меня есть несколько моделей, и у каждой есть класс Table с определенными отношениями.
// src/Model/Table/DisplaySubstancesTable.php
public function initialize(array $config)
{
$this->belongsTo('Displays', [
'foreignKey' => 'display_id',
'joinType' => 'INNER'
]);
}
// src/Model/Table/Displays.php
public function initialize(array $config)
{
$this->belongsTo('Groups', [
'foreignKey' => 'group_id',
'joinType' => 'INNER'
]);
$this->hasMany('DisplaySubstances', [
'foreignKey' => 'display_id'
]);
}
// src/Table/Model/GroupsTable.php
public function initialize(array $config)
{
$this->hasMany('Displays', [
'foreignKey' => 'group_id'
]);
$this->belongsTo('Regulations', [
'foreignKey' => 'regulation_id',
'joinType' => 'INNER'
]);
}
// src/Table/Model/Regulations.php
public function initialize(array $config)
{
$this->hasMany('Groups', [
'foreignKey' => 'regulation_id'
]);
}
Как вы можете видеть, эти модели связаны между собой. Структуры таблиц базы данных для каждой таблицы имеют соответствующие ключи. Я показал поля таблицы ниже (и удалил все поля, не относящиеся к вопросу).
MySQL> DESCRIBE display_substances;
+--------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-----------------------+------+-----+---------+----------------+
| id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| display_id | smallint(5) unsigned | NO | MUL | NULL | |
+--------------+-----------------------+------+-----+---------+----------------+
MySQL> DESCRIBE displays;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+
| id | smallint(5) unsigned | NO | PRI | NULL | auto_increment |
| group_id | int(4) unsigned | NO | MUL | NULL | |
+----------+----------------------+------+-----+---------+----------------+
MySQL> DESCRIBE groups;
+---------------+-----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-----------------+------+-----+---------+----------------+
| id | int(4) unsigned | NO | PRI | NULL | auto_increment |
| regulation_id | int(4) unsigned | NO | MUL | NULL | |
+---------------+-----------------+------+-----+---------+----------------+
MySQL> DESCRIBE regulations;
+-------------------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+----------------+
| id | tinyint(3) unsigned | NO | PRI | NULL | auto_increment |
+-------------------+---------------------+------+-----+---------+----------------+
В методе Controller у меня есть следующий код, который работает:
$DisplaySubstances = TableRegistry::get('DisplaySubstances');
$data = $DisplaySubstances->find()
->contain(['Displays'])
->where(...)
->select(['Displays.id', 'Displays.label', 'Displays.anchor', 'DisplaySubstances.value']);
То, что я хочу сделать, это включить только некоторые Regulations.id
, которые определены в массиве $include
.
Для этого я попытался использовать contain()
, чтобы он включал Regulations
:
->contain(['Displays', 'Regulations'])
Тогда планировалось использовать:
->where(['Regulations.id IN' => $include]);
Это не работает на обеих учетных записях. Когда я добавляю Regulations
в массив в contain()
, это выдает такую ошибку:
DisplaySubstances
не связано с Groups
Я не уверен почему, потому что, когда я go через мои ассоциации моделей, это отношение было определено.
Я также получаю ошибку SQL с ->where(['Regulations.id IN' => $include]);
, но я считаю, что это потому, что отношения для выполнения этой работы не
Пожалуйста, кто-нибудь может посоветовать, как использовать сдерживаемое поведение в Cake PHP, чтобы сделать эту работу?