更新:看到问题结束
我用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