【问题标题】:CakePHP - add custom SQL to a Query objectCakePHP - 将自定义 SQL 添加到 Query 对象
【发布时间】:2018-06-19 14:21:26
【问题描述】:

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

应用程序的主数据库(config/app.php 中的数据源default)已烘焙。它是一个遗留数据库,并且命名约定不是按照 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,该表存储在一个其他数据库(数据源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`, 
    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');,但它不起作用。

【问题讨论】:

    标签: orm cakephp-3.0


    【解决方案1】:

    查询构建器可让您根据需要构建查询。如果您没有该表的表对象也没关系

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

    here

    【讨论】:

      【解决方案2】:

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

      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

      【讨论】:

      • 我知道您可以编写自己的查询,但这不是我要问的。我想使用 ORM 来生成查询 - 然后通过引入我自己的 SQL 的一部分来修改该查询。如果您重新阅读该问题,您会发现所有查询都可以通过 ORM 生成,这是使用 inner join 的最后一位,需要编写为自定义 SQL。所以它是 ORM 和自定义查询的组合。
      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-26
      • 2016-02-17
      • 1970-01-01
      相关资源
      最近更新 更多