Cakephp3:CASE语句的结果被强制为字符串,需要整数
Cakephp3: Result of CASE statement being forced to string, need integer
我正在为 return 0 或 1 生成一个 case 语句:
$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 语句的结果被return编辑为字符串——“0”或“1”——这会扰乱下游逻辑。
我已尽我所能跟踪执行代码,看起来 CakePHP 正在使用传递的类型名称来正确绑定值,但该类型没有进入用于映射输出的 TypeMap。
一个简单的解决方法是事后调整值(我正在这样做),但我希望原则上能按预期工作...:)
传递给 addCase()
的类型信息仅用于输入转换,即传递的值将绑定为给定类型。 return 值,即通过编译的 CASE
语句选择的值,绝不会受到影响。
如果您想影响用于转换架构中不存在的列的选定值的类型(请注意,更改架构也会影响 ORM 的其他部分和查询构建器),那么您必须相应地更改类型映射,例如:
$query
->getSelectTypeMap()
->addDefaults([
'has_desc' => 'integer'
]);
另见
- Cakephp-3.x: How to change the data type of a selected alias?
我正在为 return 0 或 1 生成一个 case 语句:
$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 语句的结果被return编辑为字符串——“0”或“1”——这会扰乱下游逻辑。
我已尽我所能跟踪执行代码,看起来 CakePHP 正在使用传递的类型名称来正确绑定值,但该类型没有进入用于映射输出的 TypeMap。
一个简单的解决方法是事后调整值(我正在这样做),但我希望原则上能按预期工作...:)
传递给 addCase()
的类型信息仅用于输入转换,即传递的值将绑定为给定类型。 return 值,即通过编译的 CASE
语句选择的值,绝不会受到影响。
如果您想影响用于转换架构中不存在的列的选定值的类型(请注意,更改架构也会影响 ORM 的其他部分和查询构建器),那么您必须相应地更改类型映射,例如:
$query
->getSelectTypeMap()
->addDefaults([
'has_desc' => 'integer'
]);
另见
- Cakephp-3.x: How to change the data type of a selected alias?