Yii的模型的findAll()和COUNT()返回不同数量的结果(Yii model findAl

2019-10-19 15:46发布

更新:看到问题结束

我用Yii的工作(和RESTFullYii特别,但我怀疑,是有关的问题)

有一个模型CDbCriteria:

        $criteria = new CDbCriteria(
                array(
                        'together' => true,
                        'with' => array(
                            'roles'=> array(
                                'having' => "roles.role IN ($userRoles)"
                                ))
                    )
            );
        $count = $model->count($criteria);
        $result= $model->findAll($criteria);

虽然findAll()方法返回只有3条记录(这是很好的)的count()方法返回13,其是记录在由表示该表的总数$model

我已经启用查询日志记录在MySQL和我发现,被Yii生成的两个查询是完全不同的

SELECT `t`.`id` AS `t0_c0`,
       `t`.`name` AS `t0_c1`,
       `t`.`description` AS `t0_c2`,
       `t`.`enabled` AS `t0_c3`,
       `t`.`issuegroup_id` AS `t0_c4`,
       `t`.`role_id_exec` AS `t0_c5`,
       `t`.`require_attachment` AS `t0_c6`,
       `roles`.`id` AS `t1_c0`,
       `roles`.`role` AS `t1_c1`,
       `roles`.`enabled` AS `t1_c2`,
       `roles`.`description` AS `t1_c3`
FROM `issuetype` `t`
       LEFT OUTER JOIN `role_has_issuetype` `roles_roles` ON
         (`t`.`id`=`roles_roles`.`issuetype_id`)
       LEFT OUTER JOIN `role` `roles` ON
         (`roles`.`id`=`roles_roles`.`role_id`)
HAVING (roles.role IN ('user'))
LIMIT 100

其他查询:

SELECT COUNT(DISTINCT `t`.`id`)
FROM `issuetype` `t`
LEFT OUTER JOIN `role_has_issuetype` `roles_roles` ON
    (`t`.`id`=`roles_roles`.`issuetype_id`)
LEFT OUTER JOIN `role` `roles` ON
    (`roles`.`id`=`roles_roles`.`role_id`)

这是为正常行为findAll()count()方法还是我做一些我不应该做或这是Yii的错误?

而如何获得适当的记录实际计数?

count($model->findAll($criteria))似乎是工作的罚款,但是这是正确的解决方案或者是它只是一个解决方法吗?

(从性能的角度来看,我认为这可能是比实际更好count()因为我运行相同的查询两次这是由MySQL服务器缓存)

更新 :我问过GitHub上和保罗·克里莫夫亲切指出了同样的问题,这是不必要的“有”和“组”的条款是在连接表,这是完全可以将其移出“与“看这里: https://github.com/yiisoft/yii/issues/3297

Answer 1:

警予有一些问题, Having在使用标准count方法从ActiveRecord ,但它是固定在新的Yii版本: https://github.com/yiisoft/yii/pull/2167



Answer 2:

你需要克隆计数()或应用的findAll()方法之前,你的模型:

$result= $model->findAll($criteria);
$modelClone = clone $model;
$count = $model->count($criteria);


文章来源: Yii model findAll() and count() return different number of results
标签: yii