CakePHP 3.7
У меня есть 2 модели Таблицы классов следующим образом:
/src/Model/Table/SubstancesTable.php
/src/Model/Table/TblOrganisationSubstancesTable.php
Схема для каждой таблицы в MySQL выглядит следующим образом:
1.
mysql> describe substances;
+-------------+-----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------+------+-----+---------+----------------+
| id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment |
| app_id | varchar(8) | NO | UNI | NULL | |
| name | varchar(1500) | NO | | NULL | |
| date | date | NO | | NULL | |
+-------------+-----------------------+------+-----+---------+----------------+
2.
mysql> describe tbl_organisation_substances;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| o_sub_id | int(255) | NO | PRI | NULL | auto_increment |
| o_id | int(255) | NO | MUL | NULL | |
| app_id | varchar(15) | YES | | NULL | |
| os_name | varchar(255) | YES | | NULL | |
| ec | varchar(35) | YES | | NULL | |
| cas | varchar(255) | YES | | NULL | |
| upload_id | int(100) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
Я написал собственный искатель, который должен выполнитьJOIN
между этими двумя таблицами. Пользовательский искатель выглядит следующим образом и находится в SubstancesTable.php
:
public function findDistinctSubstancesByOrganisation(Query $query, array $options)
{
$o_id = $options['o_id'];
$query = $this->find()->select('id')->contain('TblOrganisationSubstances')->where(['TblOrganisationSubstances.o_id' => $o_id]);
return $query;
}
Каждая таблица имеет столбец app_id
, и это внешний ключ, который связывает 2 таблицы.
Изначально яполучено сообщение об ошибке:
Не определена ассоциация TblOrganisationSubstances для веществ.
Это имело смысл, поскольку не было введено ни одного определения.
Итак, в SubstancesTable.php
я определил это:
$this->setPrimaryKey('id');
// ...
$this->belongsTo('TblOrganisationSubstances', [
'foreignKey' => 'app_id',
'joinType' => 'INNER'
]);
Но это приводит к следующему выражению SQL:
SELECT Substances.id AS `Substances__id` FROM substances Substances INNER JOIN tbl_organisation_substances TblOrganisationSubstances ON TblOrganisationSubstances.o_sub_id = (Substances.app_id) WHERE TblOrganisationSubstances.o_id = :c0
Это не сработает, потому что TblOrganisationSubstances.o_sub_id = (Substances.app_id)
неверно,Необходимо присоединиться, основываясь на app_id
, другими словами, это должно быть:
TblOrganisationSubstances.app_id = (Substances.app_id)
Я также попытался изменить belongsTo
на hasMany
ассоциацию (даже не уверен, какая из них прямо здесь! ):
$this->hasMany('TblOrganisationSubstances', [
'foreignKey' => 'app_id',
]);
Но объединение, похоже, даже не происходит. SQL-запрос:
SELECT Substances.id AS `Substances__id` FROM substances Substances WHERE TblOrganisationSubstances.o_id = :c0
Я также попытался вставить belongsTo
в TblOrganisationSubstances.php
, чтобы попытаться определить отношения с обеих сторон:
$this->belongsTo('Substances', [
'foreignKey' => 'app_id',
'joinType' => 'INNER'
]);
Опять же, это не такт работа. Он генерирует SQL без объединения.
Пожалуйста, кто-то может помочь с советом, который является правильным типом ассоциации (hasMany
против belongsTo
) и как выполнить соединение на основе app_id
,который является внешним ключом, связывающим две таблицы.