Cakephp 3.0 使用ORM在辅助键上连接CakePHP 3
CakePHP3.5.13-使用遗留数据库。我有一个名为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在执行查询对象之前动态构建它 我的问题是这样开
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列)