我想使用查询生成器在CakePHP中编写以下查询:
SELECT
(CASE
WHEN `ai` = 1 THEN CONCAT_WS(" ", `name`, " (AI)") ELSE `name`
END) AS `name`
FROM `drivers`;
我已经尝试了几种方法,但是似乎总是失败。首先,我尝试过:
return $query->select(function(Query $query) {
return $query->newExpr()->addCase([
$query->newExpr()->add(['ai' => 1])
], [
$query->newExpr()->add(['name' => 'CONCAT_WS(" ", `name`, " (AI)")'])
]);
});
而且我已经尝试过:
return $query->select(function(Query $query) {
return $query->newExpr()->addCase([
$query->newExpr()->add(['ai' => 1])
], [
$query->newExpr()->add(['name' => $query->func()->concat([" ", 'name', " (AI)"])])
]);
});
但是在两种情况下,我都会收到此错误:
警告(2):array_combine():两个参数应具有相同数量的元素[CORE / src / ORM / ResultSet.php,第528行]
传递给Cake \ ORM \ Entity :: __ construct()的参数1必须为数组类型,给定布尔值,在/var/www/html/vendor/cakephp/cakephp/src/ORM/ResultSet.php中调用602
所以这两个都导致相同的查询,但仍然是错误的...
[您没有选择任何别名,CASE
表达式将直接按原样位于SELECT
子句中,而ORM不喜欢它,因为它试图将选择列表键与检索到的行的键进行匹配。
这可能需要更好,更有用的错误消息,或者不确定ORM在编译查询时甚至会发出警告。
总之,长话短说,返回一个带有别名的数组,如下所示:
return $query->select(function(Query $query) {
$case = $query->newExpr()->addCase(
[
// WHEN
$query->newExpr()->add(['ai' => 1])
],
[
// THEN
$query->func()->concat([' ', $query->identifier('name'), ' (AI)']),
// ELSE
$query->identifier('name')
]
);
return [
'name' => $case,
];
});
还请注意,您需要直接传递CONCAT()
函数表达式,不要将其包装在将结果分配给某些东西的另一种表达式中,这是行不通的。此外,您需要确保这样传递标识符,当前name
值将被绑定为文字字符串,并且ELSE
部分还需要另一个标识符值。
另请参见