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 更灵活,并且跨架构更兼容。
另见
我正在查询一个名为 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 更灵活,并且跨架构更兼容。
另见