【问题标题】:Add multiple count fields of contained model to query in cakephp 3在 cakephp 3 中添加包含模型的多个计数字段以进行查询
【发布时间】:2021-03-22 22:37:43
【问题描述】:

我想在我的模型中包含另一个模型包含的完整模型条目集,而不是它们的数量。我可以通过将“大小”字段添加到结果集中来做到这一点,但我想在查询中这样做,因为我想对结果进行分页和排序。我正在使用这段代码,但由于某种原因,如果第一个计数不为零,则两个计数字段具有相同的值,即第二个计数字段的值。

$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 的 Likes 中的条目数量, Favs 中具有用户 ID 的条目数量)。我试过用join()来做左连接,但一直没能得到我想要的结果。

【问题讨论】:

    标签: mysql join cakephp count cakephp-3.x


    【解决方案1】:

    如果你有多个join,那么你需要用DISTINCT计数,例如:

    COUNT(DISTINCT Likes.id)
    

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

    还请注意,您不需要重复所有分组等内容,您可以使用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),但它可以正常工作,括号将被解释为关键字后面表达式的一部分,而不是函数调用的一部分。

    【讨论】:

    • 非常感谢!添加 distinct 子句是我的问题的关键
    猜你喜欢
    • 2021-04-16
    • 2021-04-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2021-06-26
    • 1970-01-01
    相关资源
    最近更新 更多