CakePHP 3.5.13 - 使用旧数据库。我有一个名为substances
的表,主键是id
。此表中还有另一列名为app_id
。
应用程序中的大多数表都有一个外键,这意味着它们可以加入substances.id
。有一个名为article_95
的表格,其中包含字段article_95.app_id
,因此必须与substances.app_id
进行联接(而不是substances.id
- article_95
内没有对该字段的引用{1}}表格。
应用程序基于最多11个输入执行搜索。我在使用ORM之前动态构建查询对象。
我这样开始查询:
$query = $Substances->find()->select(['id' => 'Substances.id'])->distinct();
然后,如果我想做一些联接映射到substances.id
的事情,我就这样做:
// Search by CAS Number
if ($this->request->getData('cas_number')) {
$cas_number = $this->request->getData('cas_number');
$query = $query->matching('Cas', function ($q) use ($cas_number) {
return $q->where([
'Cas.value LIKE' => '%'.$cas_number.'%'
]);
});
}
到目前为止一切顺利。如果我输出SQL字符串,它看起来像这样:
'SELECT DISTINCT Substances.id AS `id` FROM substances Substances INNER JOIN cas_substances CasSubstances ON Substances.id = (CasSubstances.substance_id) INNER JOIN cas Cas ON (Cas.value like :c0 AND Cas.id = (CasSubstances.cas_id))'
我的问题在于如何在我的article_95
表格中操纵查询对象,因为当我需要它加入{{1}时,它会尝试加入substances.id
}}
我的substances.app_id
课程中有以下内容。请注意第Table
行 - 这是因为我使用的是旧版/旧数据库,而$this->setPrimaryKey('tbl_id');
表的主键实际上是article_95
而不是tbl_id
。然而,这是相对无关紧要的,因为连接应该基于两个表中都存在的id
。
app_id
如果我尝试进行包含Article 95值的搜索,则SQL字符串将变为如下所示:
// src/Model/Table/SubstancesTable.php
public function initialize(array $config)
{
$this->setTable('substances');
$this->setPrimaryKey('id');
$this->hasMany('Article95s', [
'foreignKey' => 'app_id'
]);
// ...
}
// src/Model/Table/Article95sTable.php
public function initialize(array $config)
{
$this->setTable('article_95');
$this->setPrimaryKey('tbl_id');
$this->belongsTo('Substances', [
'foreignKey' => 'app_id',
'joinType' => 'INNER'
]);
}
这个问题是SQL字符串中 'SELECT DISTINCT Substances.id AS `id` FROM substances Substances INNER JOIN cas_substances CasSubstances ON Substances.id = (CasSubstances.substance_id) INNER JOIN cas Cas ON (Cas.value like :c0 AND Cas.id = (CasSubstances.cas_id)) INNER JOIN article_95 Article95s ON (Article95s.entity_name like :c1 AND Substances.id = (Article95s.app_id))'
的一部分。我需要Substances.id = (Article95s.app_id))
,但我不知道如何使用ORM语法编写它。
其他连接(例如前面显示的CAS编号)在Substances.app_id = (Article95s.app_id))
上保持连接也很重要。
请有人帮忙吗?
答案 0 :(得分:2)
manual解释一切
bindingKey :其他表中列的名称,用于匹配foreignKey。如果未指定,将使用主键(例如Users表的id列)。
$this->belongsTo('Substances', [
'foreignKey' => 'app_id',
'bindingKey' => 'app_id',
'joinType' => 'INNER'
]);
bindingKey :当前表中列的名称,用于匹配foreignKey。如果未指定,将使用主键(例如,Articles表的id列)。
$this->hasMany('Article95s', [
'foreignKey' => 'app_id',
'bindingKey' => 'app_id',
]);