【问题标题】:Laravel - DB group by monthLaravel - 按月分组的数据库
【发布时间】:2018-08-26 09:33:59
【问题描述】:

我正在查询我的用户以返回他们的列表,这是一个示例

$user_list = DB::table('users')
            ->select('name','email','created_at')
            ->orderBy('created_at')
            ->get();

我看到了正确的结果,但我正在尝试拆分这些结果,以便它们按月分组。

有人有一些我可以阅读的文档或一些示例代码吗?

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    试试这个:

    $user_list = DB::table('users')
                ->select('name','email','created_at')
                ->orderBy('created_at')
                ->groupBy(DB::raw('MONTH(created_at)'))
                ->get();
    

    【讨论】:

    • @JohnLobo 感谢修复错误 :) 你在很短的时间内赢得了非凡的声誉
    【解决方案2】:

    文档中有一个部分,您可以在其中找到有关 groupBy 方法的信息 - method

    在你的代码中你可以写 this():

    $user_list = User::select('name','email','created_at')
            ->orderBy('created_at')->get();// get User collection
    $user_list->groupBy(function ($item, $key) {
       return $item->created_at->format('m');
    });
    

    【讨论】:

    • 不建议拉取整个列表,然后对集合进行分组。想象一下 Eloquent 查询返回的数据是一个大型数据集的场景。最好直接在数据库上处理此操作,因为数据库上的查询执行更快且优化。 @MehravishTemkar 提供的答案更加优化并遵循最佳实践。
    • @Abishek 是的,我同意你的观点。但是操作接受的答案原因可能是 Mehravish Temkar 答案将每个月返回一行,但 Pavel 答案将返回每个月的所有行。
    • @JohnLobo,@Pavel 的答案将从用户表中检索每一行,因为它在对数据库执行的第一个查询中没有任何子句。它只执行OrderBy 并从数据库中检索整个结果集。他们对集合 $user_list 进行了 GROUP BY。
    【解决方案3】:
    $groupedUsers = $users->mapToGroups(function ($user, $key) {
        return $user->created_at->month => $user; 
    });
    

    这可能比其他一些代码少一些。不过,它们都会起作用。在这里,如果您的模型设置正确,您可以将 $users 替换为 User::all()

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 2021-05-18
      • 2017-03-24
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2019-05-10
      相关资源
      最近更新 更多