CakePHP 3案例计数查询返回true而不是整数

时间:2017-04-28 23:47:13

标签: cakephp cakephp-3.0

我使用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

1 个答案:

答案 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'
]);