Mysql 在cakephp 3中将包含模型的多个计数字段添加到查询中
我希望在我的模型中包含一组完整的条目,而不是另一个包含的条目,只是数量。我可以通过将“size”字段添加到resultset中来实现这一点,但我希望在查询中实现这一点,因为我希望以数字方式对结果进行分页和排序。我正在使用这段代码,但出于某种原因,如果第一个计数不同于零,则两个计数字段都具有相同的值,即第二个计数字段的值Mysql 在cakephp 3中将包含模型的多个计数字段添加到查询中,mysql,join,cakephp,count,cakephp-3.x,Mysql,Join,Cakephp,Count,Cakephp 3.x,我希望在我的模型中包含一组完整的条目,而不是另一个包含的条目,只是数量。我可以通过将“size”字段添加到resultset中来实现这一点,但我希望在查询中实现这一点,因为我希望以数字方式对结果进行分页和排序。我正在使用这段代码,但出于某种原因,如果第一个计数不同于零,则两个计数字段都具有相同的值,即第二个计数字段的值 $query = $this->Users->find('all') ->contain(['Likes','Favs']); $q
$query = $this->Users->find('all')
->contain(['Likes','Favs']);
$query
->select(['like_count' => $query->func()->count('Likes.id')])
->leftJoinWith('Likes')
->group(['Users.id'])
->autoFields(true);
$query
->select(['fav_count' => $query->func()->count('Favs.id')])
->leftJoinWith('Favs')
->group(['Users.id'])
->autoFields(true);
$this->paginate['sortWhitelist'] = [
'name',
'email',
'last_login',
'fav_count',
'like_count',
];
我想知道为什么会发生这种情况,以及是否有任何其他方法来完成我尝试的事情,这将是有('name',email',last_login',与用户id类似的条目数量,与用户id相同的FAV中的条目数量)。我已尝试使用join()进行左连接,但未能获得所需的结果。如果有多个连接,则需要使用
DISTINCT
进行计数,例如:
COUNT(DISTINCT Likes.id)
这是因为您的结果将包含Likes*fav
行数,对于每个已加入的like,所有fav都将被加入,即对于2
Likes和10
fav,您最终总共会有20
行。常规的COUNT()
将包括这些行中的每一行
还要注意的是,您不需要重复所有分组等内容,您可以使用可调用的forselect()
来避免破坏构建器
$query=$this->Users
->查找('全部')
->选择(函数(\Cake\ORM\Query$Query){
返回[
'like_count'=>$query->func()->count(
$query->func()->distinct(['Likes.id'=>'identifier'])
),
“fav_count”=>$query->func()->count(
$query->func()->distinct(['Favs.id'=>'identifier'])
),
];
})
->自动字段(真)
->包含(['Likes','Favs']))
->leftJoinWith('Likes')
->leftJoinWith('Favs')
->组(['Users.id']);
使用functions builder生成
DISTINCT
是一种变通方法,因为目前还没有允许专门生成关键字的API。结果类似于DISTINCT(Likes.id)
,但它可以正常工作,括号将被解释为关键字后表达式的一部分,而不是函数调用的一部分。非常感谢!添加DISTINCE子句是解决我问题的关键