在cakehp3中添加要查询的包含模型的多个计数字段



我希望在我的模型中有一组完整的条目,而不是另一个包含的模型,只包含它们的数量。我可以通过添加";尺寸";字段,但我想在查询中这样做,因为我想对结果进行分页和排序。我使用的是这个代码,但由于某种原因,如果第一个计数不同于零,那么两个计数字段都具有相同的值,即第二个计数字段的值。

$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',
];

我想知道为什么会发生这种情况,以及是否有其他方法可以做我尝试的事情,那就是拥有("姓名"、电子邮件、"last_login"、带有用户id的Likes中的条目数量、带有用户id的Fav中的条目数量(。我试过用join((做左联接,但一直没能得到我想要的结果。

如果有多个联接,则需要使用DISTINCT进行计数,例如:

COUNT(DISTINCT Likes.id)

这是因为你的结果将包含Likes * Favs行数,因为对于每个加入的赞,所有的收藏夹都将被加入,即对于2个赞和10个收藏夹,你最终总共会有20行。规则的COUNT()将包括这些行中的每一行。

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

$query = $this->Users
->find('all')
->select(function (CakeORMQuery $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),但它会正常工作,括号将被解释为关键字后表达式的一部分,而不是函数调用的一部分。

最新更新