Laravel Eloquent,按月/年分组

时间:2016-11-10 13:56:09

标签: php sql laravel-5 eloquent

我试图按月和按年对数据进行分组。

$data ->select(DB::raw('count(id) as `data`'),DB::raw('YEAR(created_at) year, MONTH(created_at) month'))
           ->groupby('year','month')
           ->get();

输出结果为:

{
"data": 19215,
"year": 2016,
"month": 10
},

如果我只按月分组,我不知道这个月哪一年属于哪个,我的预期输出是:

{
"clicks": 19215,
"month": 11-2016,
},
{
"clicks": 11215,
"month": 12-2016,

},

我想在sql中完成,而不是在php中。

6 个答案:

答案 0 :(得分:10)

您可以尝试:

->select(DB::raw('count(id) as `data`'), DB::raw("DATE_FORMAT(created_at, '%m-%Y') new_date"),  DB::raw('YEAR(created_at) year, MONTH(created_at) month'))
->groupby('year','month')
->get();

答案 1 :(得分:5)

如果要按年份对结果进行分组,则可以使用闭包,将日期时间解析为所需的格式(年或月)。

下面是代码示例:

$res= ModelName::where('someColumn','test')
      ->get()
      ->groupBy(function($val) {
      return Carbon::parse($val->created_at)->format('Y');
});

答案 2 :(得分:0)

$result = ModelName::selectRaw('year(created_at) year, monthname(created_at) month, count(*) data')
                ->groupBy('year', 'month')
                ->orderBy('year', 'desc')
                ->get();

答案 3 :(得分:0)

$data ->select(DB::raw('count(id) as `data`'),DB::raw('YEAR(created_at) year'),DB::raw('MONTH(created_at) month'))
       ->groupBy(DB::raw('YEAR(created_at)'), DB::raw('MONTH(created_at)'))
       ->get();

答案 4 :(得分:0)

=>这可能会在2019年帮助某人

$date = "2019-06-16";

return date('m', strtotime($date)); //this return you 09;

因此您可以通过此方法执行foreach,因此您不需要执行所有sql任务。

答案 5 :(得分:0)

对于最新版本的mysql,可接受的答案将给出错误,因此请尝试

$data
    ->selectRaw("
        count(id) AS data, 
        DATE_FORMAT(created_at, '%Y-%m') AS new_date, 
        YEAR(created_at) AS year, 
        MONTH(created_at) AS month
    ")
    ->groupBy('new_date')
    ->get();

ref:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format