首页 > 解决方案 > 如何在 Laravel 中对三列进行分组?

问题描述

我有一个场景,首先我需要按唯一分组movie_idsession_id然后我需要按日期 [created_at] 分组。所以如果我有这个数据库结构:

movie_id | session_id | created_at
1 | 1 | 2021-05-11 16:02:41
2 | 1 | 2021-05-12 16:02:41
1 | 1 | 2021-05-11 16:02:41
1 | 1 | 2021-05-12 16:02:41

我需要这样的输出:

[{
    "date": "2021-05-11",
    "users": 1
},
{
    "date": "2021-05-12",
    "users": 2
}]

这是我到目前为止所尝试的:

$result = Activities::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])
        ->groupBy(['session_id', 'movie_id', 'date'])    
        ->get(array(
            DB::raw('Date(created_at) as date'),
            DB::raw('COUNT(*) as "views"'),
        ));

但它正在返回这个:

[{
    "date": "2021-05-11",
    "views": 2
},
{
    "date": "2021-05-12",
    "views": 1
},
{
    "date": "2021-05-12",
    "views": 1
}]

我相信 groupBy 日期不起作用。有人可以提出更好的解决方案吗?

标签: laraveleloquentgroup-by

解决方案


首先,我在movie_idsession_id列上实现了group by ,然后按日期应用group by,如下所示:

$result = Activities::whereBetween('created_at', [Carbon::now()->startOfWeek(), Carbon::now()->endOfWeek()])
            ->groupBy(['session_id', 'movie_id'])    
            ->get(array(
                DB::raw('Date(created_at) as date'),
                DB::raw('COUNT(*) as "views"'),
            ));

        $result = $result->groupBy('date');

推荐阅读