首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在cakephp 3中添加包含模型的多个count字段进行查询

在cakephp 3中添加包含模型的多个count字段进行查询
EN

Stack Overflow用户
提问于 2020-12-11 21:50:38
回答 1查看 130关注 0票数 0

我希望在我的模型中只包含它们的数量,而不是包含在另一个模型中的模型的完整条目集。我可以通过将"size“字段添加到结果集来完成此操作,但我希望在查询中执行此操作,因为我希望按时间对结果进行分页和排序。我使用的是这段代码,但是由于某些原因,如果第一个count不是0,两个count字段具有相同的值,即第二个count字段的值。

代码语言:javascript
复制
$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()来执行左连接,但是我没有得到我想要的结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-12 01:49:31

如果你有多个joins,那么你需要用DISTINCT来计算,例如:

代码语言:javascript
复制
COUNT(DISTINCT Likes.id)

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

还要注意的是,你不需要重复所有的分组等东西,你可以使用callable for select()来避免破坏构建器。

代码语言:javascript
复制
$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),但它将工作得很好,括号将被解释为关键字后表达式的一部分,而不是函数调用的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65252599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档