我使用CakePHP 3查询构建器来计算记录。计数结果之一返回true
而不是实际的2的整数。如果我要在PHPAdmin中运行输出的MySQL,那么我会看到所有整数。看起来很奇怪。
invitation_sent
的表字段是布尔值
$query = $this->Guests->find('all', $options);
$inviteNotSent = $query->newExpr()
->addCase(
$query->newExpr()->add(['invitation_sent' => 0]),
1,
'integer'
);
$inviteSent = $query->newExpr()
->addCase(
$query->newExpr()->add(['invitation_sent' => 1]),
1,
'integer'
);
$query->select([
'invitation_not_sent' => $query->func()->count($inviteNotSent),
'invitation_sent' => $query->func()->count($inviteSent)
]);
$query->hydrate(false);
$result = $query->toList();
MySQL生成
SELECT
(
COUNT(
(
CASE WHEN invitation_sent = 0 THEN 1 END
)
)
) AS `invitation_not_sent`,
(
COUNT(
(
CASE WHEN invitation_sent = 1 THEN 1 END
)
)
) AS `invitation_sent`
FROM
guests Guests
CakePHP返回的结果是
result (array)
0 (array)
invitation_not_sent 0
invitation_sent (true)
预期结果
result (array)
0 (array)
invitation_not_sent 0
invitation_sent 2
答案 0 :(得分:2)
您的invitation_sent
列属于布尔类型,因此您最终会得到true
而不是数字值,这是预期的结果。禁用水合作用也不会阻止这种情况,因为水合作用(将数据集转换为实体)与转换是分开的,integer
方法中定义addCase()
也不会影响这一点,因为该类型仅用于输入转换。
我建议在计算列时一般避免使用现有的列名,除非确实需要这样做。简单的修复,只是使用不同的名称,例如复数也可以从语言学的角度来理解(例如invitations_*
)。
默认情况下,表模式中不存在的列将作为字符串返回,如果您希望将它们转换为整数,则可以相应地修改选择类型映射。
$query->select([
'invitations_not_sent' => $query->func()->count($inviteNotSent),
'invitations_sent' => $query->func()->count($inviteSent)
]);
$query->selectTypeMap()->addDefaults([
'invitations_not_sent' => 'integer',
'invitations_sent' => 'integer'
]);