CakePHP查询生成器的个案语句导致`array_combine()并键入错误

问题描述 投票:0回答:1

我想使用查询生成器在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

所以这两个都导致相同的查询,但仍然是错误的...

php cakephp case query-builder cakephp-3.x
1个回答
0
投票

[您没有选择任何别名,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部分还需要另一个标识符值。

另请参见

© www.soinside.com 2019 - 2024. All rights reserved.