【问题标题】:Laravel Eloquent, group by month/yearLaravel Eloquent,按月/年分组
【发布时间】: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 中。

【问题讨论】:

    标签: php sql laravel-5 eloquent


    【解决方案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 有关。请检查此stackoverflow.com/q/34115174/6040777
          • 不符合 Mysql 5.7
          • groupby 会失败
          • 我已经在上面评论过它与 MySQL 相关,请查看stackoverflow.com/questions/34115174/…。并且 OP 已经在他的查询中使用了groupBY,他对此没有任何问题。在这里询问是否符合 MySQL 完全是题外话。
          猜你喜欢
          • 2015-07-12
          • 2019-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多