【问题标题】:Laravel - get the top 5 by number of occurrencesLaravel - 按出现次数获得前 5 名
【发布时间】:2016-05-24 08:03:28
【问题描述】:

我有具有 article_id 字段的表 cmets、votes、views、likes。我试图从这些表中获取前 5 篇文章,按它们中出现的次数。我将$modelName 发送到我的函数,然后尝试从查询中获取结果。这就是我的查询现在的样子:

private function query($modelName) {
        $mostSomethingArticle = $modelName->all()->groupBy('article_id')->take(5);

        return $mostSomethingArticle;

      }

现在,我得到了这样的结果:

Collection {#398 ▼
  #items: array:5 [▼
    5 => Collection {#377 ▼
      #items: array:5 [▶]
    }
    2 => Collection {#376 ▼
      #items: array:1 [▶]
    }
    6 => Collection {#397 ▼
      #items: array:3 [▶]
    }
    1 => Collection {#396 ▼
      #items: array:1 [▶]
    }
    7 => Collection {#395 ▼
      #items: array:5 [▶]
    }
  ]
}

我想知道如何进行查询,以获取前 5 个结果,其中出现次数为 'desc' 顺序。

【问题讨论】:

    标签: php mysql eloquent laravel-5.2


    【解决方案1】:

    如果将来有人需要,我将发布我的解决方法,而不是传递$modelName,我决定从 $request 获取表的名称,然后执行如下查询:

    $result = DB::table($request['option'])
                    ->select(DB::raw('article_id'), DB::raw('count(*) as count'))
                    ->groupBy('article_id')
                    ->orderBy('count', 'desc')
                    ->take(5)
                    ->get();
    

    【讨论】:

    • 不错的解决方法,但如果您可以使用直接雄辩的请求来做到这一点会更好。
    【解决方案2】:

    不确定您的意思是否是这样,但如果您有一列包含occurrences,您可以先按此列排序,然后得到结果:

    $modelName->all()->groupBy('article_id')->sortByDesc('occurrences')->take(5);
    

    也可以试试:

    $mostSomethingArticle = $modelName->all()->groupBy('article_id')->sortByDesc(function($model)
    {
        return $model->occurrences;
    });
    

    希望这会有所帮助。

    【讨论】:

    • 我已经尝试过了,但我收到一个错误,因为您不能在收集时使用 orderBy。
    • 我已经尝试过了,但我仍然得到相同的结果。我想出了一个不同的解决方案。
    猜你喜欢
    • 2018-11-06
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-20
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多