繁体   English   中英

Laravel Eloquent,按月/年分组

[英]Laravel Eloquent, group by month/year

我正在尝试按月和年对数据进行分组。

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

output 是:

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

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

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

我想在 sql 中进行,而不是在 php 中进行。

您可以尝试如下:

->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();

注意:这是基于 eloquent 的解决方案,是的,它不是最好的方法,但问题是,这是使用 eloquent。 如果您想要更快的方式,您可以使用原始查询来完成。

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

以下是代码示例:

$res= ModelName::where('someColumn','test')
      ->get()
      ->groupBy(function($val) {
      return Carbon::parse($val->created_at)->format('Y');
});
$result = ModelName::selectRaw('year(created_at) year, monthname(created_at) month, count(*) data')
                ->groupBy('year', 'month')
                ->orderBy('year', 'desc')
                ->get();
$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();

=>这可能对 2019 年的某人有所帮助

$date = "2019-06-16";

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

所以你可以通过这种方法来做 foreach,所以你不需要做所有的 sql 事情..

对于最新版本的 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();

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

@Amit Gupta 的回答很好,但它不起作用 >= MySQL 5.7/MariaDB 10.2 并调用错误:

语法错误或访问冲突:SELECT 列表的 1055 表达式 #2 不在 GROUP BY 子句中并且包含非聚合列

要解决该问题,您可以使用例如。 非聚合列上的MIN()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM