Laravel Eloquent得到的结果怎么按天分组?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (137)

我现在有一张表格_每次访问者访问页面时记录一行的视图,记录用户的IP/id和页面本身的id。我要补充的是_at列的类型是:时间戳,因此它包括小时/分钟/秒。当我尝试groupBy查询时,由于秒的不同,它不会将相同的日子分组在一起。

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()查询才能实现这一点,你能帮帮我吗?

提问于
用户回答回答于

我相信我已经找到了解决这个问题的方法,关键是MySQL中的date()函数,它将日期时间转换为仅日期:

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

第一个WHERE子句使用Carbon日期进行比较。

$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"')
                            ));
用户回答回答于

你可以使用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
    });

扫码关注云+社区