Cakephp 3.0 使用ORM在辅助键上连接CakePHP 3

Cakephp 3.0 使用ORM在辅助键上连接CakePHP 3,cakephp-3.0,Cakephp 3.0,CakePHP3.5.13-使用遗留数据库。我有一个名为substances的表,其中主键是id。此表中还有另一列名为app\u id 应用程序中的大多数表都有外键,这意味着它们可以连接到substances.id。有一个名为article_95的表,它有一个字段article_95.app_id,因此必须连接到物质.app_id(不是物质.id-在article_95表中根本没有对该字段的引用) 应用程序基于多达11个输入执行搜索。我正在使用ORM在执行查询对象之前动态构建它 我的问题是这样开

CakePHP3.5.13-使用遗留数据库。我有一个名为
substances
的表,其中主键是
id
。此表中还有另一列名为
app\u id

应用程序中的大多数表都有外键,这意味着它们可以连接到
substances.id
。有一个名为
article_95
的表,它有一个字段
article_95.app_id
,因此必须连接到
物质.app_id
(不是
物质.id
-在
article_95
表中根本没有对该字段的引用)

应用程序基于多达11个输入执行搜索。我正在使用ORM在执行查询对象之前动态构建它

我的问题是这样开始的:

$query = $Substances->find()->select(['id' => 'Substances.id'])->distinct();
// 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.'%'
        ]);
    });
}
'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))'
'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))'
然后,如果我想在join映射到
substances.id
的地方做一些事情,我会这样做:

$query = $Substances->find()->select(['id' => 'Substances.id'])->distinct();
// 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.'%'
        ]);
    });
}
'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))'
'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))'
到目前为止还不错。如果我输出SQL字符串,它如下所示:

$query = $Substances->find()->select(['id' => 'Substances.id'])->distinct();
// 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.'%'
        ]);
    });
}
'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))'
'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))'
我的问题是,当查询对象进入我的
article_95
表时,如何操作它,因为当我需要它加入
substances.app_id
时,它正试图加入
substances.id

我的
表中有以下内容
类。请注意行
$this->setPrimaryKey('tbl_id')-这是因为我使用的是一个遗留/旧数据库,
article\u 95
表的主键实际上是
tbl\u id
而不是
id
。但是,这相对来说并不重要,因为联接应该基于两个表中都存在的
app\u id

// 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'
    ]);
}
如果我尝试执行包含Article 95值的搜索,则SQL字符串如下所示:

$query = $Substances->find()->select(['id' => 'Substances.id'])->distinct();
// 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.'%'
        ]);
    });
}
'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))'
'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))'
这个问题是SQL字符串的一部分,它读取
Substances.id=(Article95s.app_id))
。我需要它是
Substances.app_id=(Article95s.app_id))
,但我不知道如何用ORM语法编写它

substances.id
上保持其余连接(如前面显示的CAS编号)的连接也很重要

有人能帮忙吗?

老师解释一下

属于 bindingKey:其他表中用于匹配外键的列的名称。如果未指定,将使用主键(例如用户表的id列)

有许多 bindingKey:当前表中用于匹配foreignKey的列的名称。如果未指定,将使用主键(例如Articles表的id列)

老师解释了这一切

属于 bindingKey:其他表中用于匹配外键的列的名称。如果未指定,将使用主键(例如用户表的id列)

有许多 bindingKey:当前表中用于匹配foreignKey的列的名称。如果未指定,将使用主键(例如Articles表的id列)