Laravel Eloquent获得按天数分组的结果

2022-08-30 09:32:08

我目前有一个表格,每次访问者访问页面时记录一行,记录用户的ip / id和页面本身的ID。我应该补充一点,该列的类型为:时间戳,因此它包括小时/分钟/秒。当我尝试查询时,由于秒数差异,它不会将相同的天组合在一起。page_viewscreated_atgroupBy

created_at         page_id       user_id
==========         =======       =======
10-11-2013            3            1
10-12 2013            5            5
10-13 2013            5            2
10-13 2013            3            4
  ...                ...          ...

我想根据每天的观看次数获得结果,这样我就可以得到如下结果:

  date          views
  ====          =====
10-11-2013       15
10-12 2013       45
  ...            ...

我想我需要深入研究查询才能实现这一目标,但任何见解都会有很大的帮助,谢谢DB::raw()

编辑:添加了对格式的说明。created_at


答案 1

我相信我已经找到了解决这个问题的方法,关键是mysql中的DATE()函数,它将DateTime转换为Date:

DB::table('page_views')
      ->select(DB::raw('DATE(created_at) as date'), DB::raw('count(*) as views'))
      ->groupBy('date')
      ->get();

但是,这并不是一个真正的Laravel雄辩的解决方案,因为这是一个原始查询。以下是我在雄辩式语法中想到的。第一种是使用碳日期进行比较。

$visitorTraffic = PageView::where('created_at', '>=', \Carbon\Carbon::now->subMonth())
                            ->groupBy('date')
                            ->orderBy('date', 'DESC')
                            ->get(array(
                                DB::raw('Date(created_at) as date'),
                                DB::raw('COUNT(*) as "views"')
                            ));

答案 2

您可以使用Carbon(集成在Laravel中)

// Carbon
use Carbon\Carbon;   
$visitorTraffic = PageView::select('id', 'title', 'created_at')
    ->get()
    ->groupBy(function($date) {
        return Carbon::parse($date->created_at)->format('Y'); // grouping by years
        //return Carbon::parse($date->created_at)->format('m'); // grouping by months
    });

推荐