CakePHP-将自定义SQL添加到查询对象

时间:2018-06-19 14:21:26

标签: orm cakephp-3.0

我正在使用CakePHP 3.5.13构建具有4个独立数据库的应用程序。

该应用程序的主数据库(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_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

我需要修改它,以便查询包含一个INNER JOIN到一个表,该表存储在 other 个数据库(sdb5_tmpdata中的数据源config/app.php )。我需要的SQL如下:

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;

上述查询与原始查询之间的区别在于以下SQL:

INNER JOIN `sdb5_tmpdata`.`searching_1745` AS tf 
ON tf.id = Substances.id

我没有用于表'searching_1745'的相应模型,因为这些表是在保存“临时”用户数据的数据库上动态创建(并随后删除)的。

是否可以修改查询对象$query,以便我可以引入执行inner join的自定义SQL?

我尝试了$query = $query->newExpr()->add('INNER JOIN 'sdb5_tmpdata'.'searching_1745' AS tf ON tf.id = Substances.id');,但是它不起作用。

2 个答案:

答案 0 :(得分:1)

查询构建器使您可以根据需要构建查询。没有该表的表对象没关系

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

请参阅here

答案 1 :(得分:0)

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

use Cake\Datasource\ConnectionManager;

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

有关更多信息,请阅读:https://book.cakephp.org/3.0/en/orm/database-basics.html#executing-queries