cakephp - Cakephp3:CASE语句的结果被强制为字符串,需要整数
问题描述
我正在生成一个 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。
一个简单的解决方法是事后调整值(我正在这样做),但我希望原则上按预期工作...... :)
解决方案
传递给的类型信息addCase()
仅用于输入转换,即传递的值将绑定为给定类型。返回值,即通过编译CASE
语句选择的值,不会受到影响。
如果您想影响用于转换模式中不存在的列的选定值的类型(请注意,更改模式也会影响 ORM 和查询构建器的其他部分),那么您必须相应地更改类型映射, 例如:
$query
->getSelectTypeMap()
->addDefaults([
'has_desc' => 'integer'
]);
也可以看看
推荐阅读
- python-3.x - 使用 pip 安装模块时如何修复 EnvironmentError?
- python - Python 中的 SimpleQueue 与 Queue - 使用 SimpleQueue 的优势是什么?
- python - 使用机器人框架python陷入移动UI自动化Appium
- azure-data-explorer - Azure KUSTO 语句失败并显示“未找到表格语句”
- c - 在 Node-Red 上导入 C 项目
- python - 使用用户提供的参数运行我的 clear 命令会导致 TypeError: '<=' not supported between 'str' 和 'int'
- asp.net-core-mvc - 如何将所有请求路由到 HomeController
- objective-c - NSArray 创建一个子数组,然后对值求和
- google-cloud-platform - GCP Memorystore 主机发现和 CNAME
- python - 使用python根据文件夹中的长度拆分多个csv文件