Cake PHP 3 - сдерживаемое поведение не работает на моделях, даже если они связаны - PullRequest
1 голос
/ 23 апреля 2020

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, чтобы сделать эту работу?

...