【问题标题】:Laravel 5.6 groupBy on collection doesn't workLaravel 5.6 groupBy 收集不起作用
【发布时间】:2019-03-27 22:13:30
【问题描述】:

GroupBy 在 Laravel 5.6 中不能用于收集,当简单的事情本应该起作用时,这很烦人......

$users = Game::orderBy('game_count', 'desc')->get();

$users_grouped = $users->groupBy('user_id');

您可能猜到$users_grouped 包含与$users 相同的集合,具有相同的重复user_id 值。

我不明白为什么它不能按预期工作以及如何解决?

至少GROUP BY 希望能与原始数据库选择一起使用。但我想使用 Eloquent ..

【问题讨论】:

    标签: php mysql laravel collections grouping


    【解决方案1】:

    您将 eloquent 的查询构建器与集合混淆了。它们不是一回事。

    查询构建器实例上的 groupBy 将使用 SQL GROUP BY 并为您要分组的列提供一个聚合结果。

    集合实例上的groupBy 将返回一个新集合,该集合按给定键的值对所有收集的项目进行分组。

    https://laravel.com/docs/5.6/collections#method-groupby

    如果您想使用查询构建器的 groupBy 方法,请将其链接在 get() 之前:

    $users = Game::orderBy('game_count', 'desc')->groupBy('user_id')->get();
    

    get() 执行查询并返回记录集合。

    【讨论】:

    • 我的困惑不亚于 Eloquent :) 在您的示例中,您将得到与 $users = Game::groupBy('user_id')->get(); 相同的结果,因此在这种情况下 orderBy 没有意义。
    • @mr.boris 您的问题不清楚。所以你可能想写一个新的,更清楚你需要什么。 groupBy 你如何使用它根本没有使用 Eloquent,它在集合上调用 groupBy 并且它不会是同一个集合,它将被完全不同的分组。
    【解决方案2】:

    如果您想通过 user_id 对查询进行分组,只需在 get() 之前执行 groupBy,如下所示:

    $users = Game::orderBy('game_count', 'desc')->groupBy('user_id')->get();
    

    【讨论】:

    • 不,我想先对查询进行排序,然后再分组。抱歉,您提供的查询没有意义,您可以删除 orderBy 运算符,您将得到相同的结果..
    【解决方案3】:

    行将是相同的。你应该做两个查询:

    $users = Game::orderBy('game_count', 'desc')->get();
    $users_grouped = Game::orderBy('game_count', 'desc')->groupBy('user_id')->get();
    

    【讨论】:

    • 不幸的是,$users$users_grouped 在您的示例中将完全相同。
    【解决方案4】:

    对此的临时解决方案是原始 SQL 查询:

    $users_grouped  = DB::select('SELECT COUNT(id) AS theCount, `user_id` from `quiz_games` GROUP BY `user_id` ORDER BY theCount DESC');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-01
      • 2019-04-18
      • 2018-09-28
      • 2018-07-30
      • 1970-01-01
      • 2022-01-13
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多