我希望在我的模型中只包含它们的数量,而不是包含在另一个模型中的模型的完整条目集。我可以通过将"size“字段添加到结果集来完成此操作,但我希望在查询中执行此操作,因为我希望按时间对结果进行分页和排序。我使用的是这段代码,但是由于某些原因,如果第一个count不是0,两个count字段具有相同的值,即第二个count字段的值。
$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)。我尝试过使用join()来执行左连接,但是我没有得到我想要的结果。
发布于 2020-12-12 01:49:31
如果你有多个joins,那么你需要用DISTINCT来计算,例如:
COUNT(DISTINCT Likes.id)这是因为你的结果将包含Likes * Favs行数,因为对于每一个加入的点赞,所有的偏好都将被加入,即对于2点赞和10点赞,你最终会得到总共20行。常规的COUNT()将包含这些行中的每一行。
还要注意的是,你不需要重复所有的分组等东西,你可以使用callable for select()来避免破坏构建器。
$query = $this->Users
->find('all')
->select(function (\Cake\ORM\Query $query) {
return [
'like_count' => $query->func()->count(
$query->func()->distinct(['Likes.id' => 'identifier'])
),
'fav_count' => $query->func()->count(
$query->func()->distinct(['Favs.id' => 'identifier'])
),
];
})
->autoFields(true)
->contain(['Likes', 'Favs'])
->leftJoinWith('Likes')
->leftJoinWith('Favs')
->group(['Users.id']);使用函数构建器来生成DISTINCT是一种变通方法,因为目前还没有允许专门生成关键字的API。结果将类似于DISTINCT(Likes.id),但它将工作得很好,括号将被解释为关键字后表达式的一部分,而不是函数调用的一部分。
https://stackoverflow.com/questions/65252599
复制相似问题