Orm CakePHP-向查询对象添加自定义SQL

Orm CakePHP-向查询对象添加自定义SQL,orm,cakephp-3.0,Orm,Cakephp 3.0,我正在使用CakePHP3.5.13构建一个包含4个独立数据库的应用程序 应用程序的主数据库(Datasourcedefault位于config/app.php中)已烘焙。它是一个遗留数据库,命名约定不是按照CakePHP指定的方式编写的。尽管如此,在浏览模型和编辑内容之后,它仍然有效 在控制器中,我具有以下功能: $substances = TableRegistry::get('Substances'); $query = $substances->find()->limit(

我正在使用CakePHP3.5.13构建一个包含4个独立数据库的应用程序

应用程序的主数据库(Datasource
default
位于
config/app.php
中)已烘焙。它是一个遗留数据库,命名约定不是按照CakePHP指定的方式编写的。尽管如此,在浏览模型和编辑内容之后,它仍然有效

在控制器中,我具有以下功能:

$substances = TableRegistry::get('Substances');

$query = $substances->find()->limit(250)->offset(0);

$query->select(['id', 'app_id', 'name']);

$query->contain([
'Cas' => [
        'sort' => ['Cas.id' => 'ASC']
    ]
]);

$query->contain([
'Ecs' => [
        'sort' => ['Ecs.id' => 'ASC']
    ]
]);
如果我
var\u dump($query)
得到一个SQL字符串,如下所示:

SELECT Substances.id AS `Substances__id`, 
    Substances.app_id AS `Substances__app_id`, 
    Substances.name AS `Substances__name` 
FROM substances Substances LIMIT 250 OFFSET 0
SELECT Substances.id AS `Substances__id`, 
    Substances.app_id AS `Substances__app_id`, 
    Substances.name AS `Substances__name`, 
    Substances.date AS `Substances__date` 
FROM substances Substances 
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf 
ON tf.id = Substances.id LIMIT 250 OFFSET 0;
我需要对此进行修改,以便查询包含对存储在另一个数据库(Datasource
sdb5_tmpdata
in
config/app.php
中)中的表的
内部联接。我需要的SQL如下所示:

SELECT Substances.id AS `Substances__id`, 
    Substances.app_id AS `Substances__app_id`, 
    Substances.name AS `Substances__name` 
FROM substances Substances LIMIT 250 OFFSET 0
SELECT Substances.id AS `Substances__id`, 
    Substances.app_id AS `Substances__app_id`, 
    Substances.name AS `Substances__name`, 
    Substances.date AS `Substances__date` 
FROM substances Substances 
INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf 
ON tf.id = Substances.id LIMIT 250 OFFSET 0;
上述查询与原始查询的区别如下:

INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf 
ON tf.id = Substances.id
我没有表
'searging_1745'
的对应模型,因为这些表是在保存“临时”用户数据的数据库上动态创建的(后来被删除)

是否可以修改查询对象,
$query
,以便引入执行
内部联接的自定义SQL


我尝试了添加('internaljoin'sdb5_tmpdata.'search_1745'作为tf ON tf.id=Substances.id')但它不起作用

我不知道您是否可以修改查询对象,但您可以随时编写自己的自定义查询:

use Cake\Datasource\ConnectionManager;

$conn = ConnectionManager::get('default');
$query = $conn->query('query goes here');

有关更多信息,请阅读:

查询生成器允许您根据需要构建查询。如果您没有该表的表对象,这并不重要

$query->join([
    'tf ' => [
        'table' => 'sdb5_tmpdata.searching_1745',
        'type' => 'INNER',
        'conditions' => 'tf.id = Substances.id',
    ]);

请参见

我知道您可以编写自己的查询,但这不是我要问的。我想使用ORM生成一个查询,但随后通过引入我自己的SQL的一部分来修改该查询。如果你重读这个问题,你会发现所有的查询都可以通过ORM生成,这是使用
内部连接的最后一位,需要编写为自定义SQL。所以它是ORM和自定义查询的组合。