CakePHP 3 引用在我的 find() 调用的 'fields' 配置中定义的函数名称

CakePHP 3 quoting function names defined in 'fields' configuration of my find() call

我正在查询一个名为 order 的数据库 table,因此我必须在我的 app.php 配置中设置 'quoteIdentifiers' => true。但是,当我将函数名称放入 find() 调用的 fields 配置中时,CakePHP 也会引用它们。

    $orders->find('all', array(
        'fields' => array(
            'DATE(Orders.date_added)',
            'COUNT(*)',
        ),
        'conditions' => array(
            'Orders.order_status_id <>' => 0,
        ),
        'group' => array(
            'DATE(Orders.date_added)',
        ),
    ));

上面的查询最终调用

SELECT <...>, `DATE(Orders.date_added)` FROM `order` <...>

这显然会引发错误。

我用谷歌搜索了很多,尝试过 this:

    $orders = $orders->find('all', array(
        'conditions' => array(
            'Orders.order_status_id <>' => 0,
        ),
        'group' => array(
            'DATE(Orders.date_added)',
        ),
    ))->select(function($exp) {
        return $exp->count('*');
    });

这也不起作用,给我一些 array_combine 错误。

有什么方法可以取消对这些函数名称的引用,同时保持查询的其余部分自动引用?这是我想要完成的:

SELECT <...>, DATE(Orders.date_added) FROM `order` <...>

请帮忙。

你应该使用函数表达式,它们不会被引用,除了被明确定义为标识符的参数:

$query = $orders->find();

$query
    ->select([
        'date' => $query->func()->DATE([
            'Orders.date_added' => 'identifier'
        ]),
        'count' => $query->func()->count('*')
    ])
    ->where([
        'Orders.order_status_id <>' => 0
    ])
    ->group([
        $query->func()->DATE([
            'Orders.date_added' => 'identifier'
        ])
    ]);

我通常建议您尽可能使用表达式而不是传递原始 SQL 片段,这样可以使生成 SQL 更灵活,并且跨架构更兼容。

另见