CakePHP 3使用ORM

时间:2018-05-29 09:46:57

标签: cakephp-3.0

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))上保持连接也很重要。

请有人帮忙吗?

1 个答案:

答案 0 :(得分:2)

manual解释一切

属于关联

  

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

$this->belongsTo('Substances', [
    'foreignKey' => 'app_id',
    'bindingKey' => 'app_id',
    'joinType' => 'INNER'
]);

的hasMany

  

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

$this->hasMany('Article95s', [
    'foreignKey' => 'app_id',
    'bindingKey' => 'app_id',
]);