Cakephp3:CASE语句的结果被强制为字符串,需要整数

时间:2018-04-27 16:44:46

标签: cakephp cakephp-3.0

我正在生成一个case语句来返回0或1:

$desc_case = $q->newExpr()
    ->addCase(
            [$q->newExpr()->add(["description IS" => NULL])],
            [0,1],
            ["integer","integer"]
            );
$q = $q->select(["has_desc" => $desc_case]);

这导致以下正确的SQL:

SELECT [fields removed for clarity], (CASE WHEN (description) IS NULL THEN :c0 ELSE :c1 END) AS `has_desc` FROM skills Skills

我已经解除了水分,并用

检索了结果
->hydrate(false)->toArray();

CASE语句的结果以字符串形式返回 - " 0"或" 1" - 这扰乱了下游的逻辑。

我已经尽可能地跟踪了执行代码,看起来CakePHP使用传递的类型名称来正确绑定值,但是类型无法进入用于映射输出的TypeMap。

一个简单的解决方法是在事后(我正在做)调整值,但我希望原则上按预期工作......:)

1 个答案:

答案 0 :(得分:1)

传递给addCase()的类型信息仅用于输入转换,即传递的值将作为给定类型绑定。返回值,即通过编译的CASE语句选择的值,绝不会受到影响。

如果要影响用于转换模式中不存在的列的选定值的类型(请注意,更改模式也会影响ORM的其他部分和查询构建器),那么您必须更改相应地输入地图,例如:

$query
    ->getSelectTypeMap()
    ->addDefaults([
        'has_desc' => 'integer'
    ]);

另见