Laravel Eloquent,按月/年分组

Posted

技术标签:

【中文标题】Laravel Eloquent,按月/年分组【英文标题】:Laravel Eloquent, group by month/year 【发布时间】:2017-03-24 14:01:58 【问题描述】:

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

$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 中。

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

下面是代码示例:

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

【讨论】:

这实际上是从数据库中获取每一行到 laravel 中,然后在 php.ini 中进行分组。不推荐的方法。 这是基于 eloquent 的解决方案,是的,这不是最好的方法,但问题是,这是使用 eloquent。如果您想要更快的方式,您可以使用原始查询来完成。 如何按年份和月份分组 @Brane 如何按年份和月份分组,我们会返回这个Carbon::parse($val->created_at)->format('M-Y'); 吗?? @DeanVanGreunen 来自文档,语法大概是这样的->format('F Y');【参考方案3】:

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

$date = "2019-06-16";

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

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

【讨论】:

你是说06吗?【参考方案4】:
$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();

【讨论】:

【参考方案5】:
$result = ModelName::selectRaw('year(created_at) year, monthname(created_at) month, count(*) data')
                ->groupBy('year', 'month')
                ->orderBy('year', 'desc')
                ->get();

【讨论】:

【参考方案6】:

你可以试试:

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

【讨论】:

QLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列 这与 MySQL 有关。请检查此***.com/q/34115174/6040777 不符合 Mysql 5.7 groupby 会失败 我已经在上面评论过它与 MySQL 相关,请查看***.com/questions/34115174/…。并且 OP 已经在他的查询中使用了groupBY,他对此没有任何问题。在这里询问是否符合 MySQL 完全是题外话。

以上是关于Laravel Eloquent,按月/年分组的主要内容,如果未能解决你的问题,请参考以下文章

如何简化 Laravel 查询以按年搜索日期并按月分组

Laravel 按 Eloquent 关系分组

按 id 分组 Laravel Eloquent 枢轴值

Laravel Eloquent 查询,带有连接、计数和分组依据

Laravel Eloquent按天分组结果

LINQ:在日期时间字段中按月和年分组