代码之家  ›  专栏  ›  技术社区  ›  Hardist

Laravel groupBy和raw查询

  •  2
  • Hardist  · 技术社区  · 6 年前

    我从未真正使用过groupBy或原始查询,尤其是很长一段时间。我只是想知道以下是否可能:

    $payments = Payment::all();
    
    $grouped = $payments->groupBy('date');
    
    dd($grouped->toArray());
    

    "2018-08-21" => array:1 [▶]
    "2018-06-21" => array:1 [▶]
    

    我想做的是这样获取数据:

    "2018-08-21" => array:2 [▶]
    

    所以基本上我想把月份变成当前月份,然后按天对数据进行分组。在上面的例子中,日期 21-06-2018 已更改为 21-08-2018 它和21日的另一个日期组合在一起。

    简单地说,我只想按日期列的日期对结果进行分组,而忽略月份和年份。对于(原始)查询,这是可能的,还是应该在之后操作数据?

    4 回复  |  直到 6 年前
        1
  •  2
  •   Erubiel    6 年前

    您还可以使用类似于@elitepc的回答,您的解决方案之所以有效是因为您正确地使用了groupBy集合函数,而此解决方案使用了groupBy雄辩的查询生成器函数。别跟他们搞混了,不然你会很不开心的。

    这应该有效:

    $payments = Payment::orderBy('created_at', 'DESC')
        ->groupBy(DB::raw('DAY(date)'))
        ->get();
    
        2
  •  2
  •   Hardist    6 年前

    $payments = Payment::orderBy('created_at', 'DESC')->get()
            ->groupBy(function($date) {
                return Carbon::parse($date->date)->format('d');
            });
    
        3
  •  1
  •   GAURAV VAGHELA    6 年前

    是的,这是可能的。 你可以试试这个。

    $payments = Payment::->select(*, DB::raw('DAY(date) AS day'))->get();
    
    $grouped = $payments->groupBy('day');
    
    dd($grouped->toArray());
    
        4
  •  0
  •   Pedro Caseiro    6 年前

    $grouped = $payments->groupBy(DB::raw('DAY(date)'));
    

    这样,只有日期的日部分才被视为分组。