Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在cakephp 3中将包含模型的多个计数字段添加到查询中_Mysql_Join_Cakephp_Count_Cakephp 3.x - Fatal编程技术网

Mysql 在cakephp 3中将包含模型的多个计数字段添加到查询中

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

我希望在我的模型中包含一组完整的条目,而不是另一个包含的条目,只是数量。我可以通过将“size”字段添加到resultset中来实现这一点,但我希望在查询中实现这一点,因为我希望以数字方式对结果进行分页和排序。我正在使用这段代码,但出于某种原因,如果第一个计数不同于零,则两个计数字段都具有相同的值,即第二个计数字段的值

$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()
将包括这些行中的每一行

还要注意的是,您不需要重复所有分组等内容,您可以使用可调用的for
select()
来避免破坏构建器

$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子句是解决我问题的关键