【问题标题】:Case statement with CakePHP Query Builder causes `array_combine()` and type errorCakePHP Query Builder 的 case 语句导致 `array_combine()` 和类型错误
【发布时间】:2020-04-20 05:39:08
【问题描述】:

我想使用查询构建器在 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, line 528]

传递给 Cake\ORM\Entity::__construct() 的参数 1 必须是数组类型,bool 给定,在 /var/www/html/vendor/cakephp/cakephp/src/ORM/ResultSet.php 中调用第 602 行

所以这两个结果都是相同的查询,但它仍然是错误的......

【问题讨论】:

    标签: php cakephp case query-builder cakephp-3.x


    【解决方案1】:

    您没有选择任何别名,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 部分提供第二个标识符值。

    另见

    【讨论】:

    • 完美。谢谢。我检查了手册,但显然不够好。同意,它可以使用更好的错误消息,但我也可以更好地找到我的资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2020-02-14
    • 2020-05-17
    相关资源
    最近更新 更多