Laravel组按原始查询

时间:2018-08-22 18:17:04

标签: php laravel

我从来没有真正使用过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 个答案:

答案 0 :(得分:2)

这对我有用:

$payments = Payment::orderBy('created_at', 'DESC')->get()
        ->groupBy(function($date) {
            return Carbon::parse($date->date)->format('d');
        });

答案 1 :(得分:2)

您还可能使用了与@elitepc回答类似的东西,您的解决方案起作用的原因是因为您正确使用了groupBy Collection函数,该解决方案使用了groupBy Eloquent查询构建器函数。不要对它们感到困惑,否则您会度过一段糟糕的时光。

这应该有效:

$payments = Payment::orderBy('created_at', 'DESC')
    ->groupBy(DB::raw('DAY(date)'))
    ->get();

答案 2 :(得分:1)

是的,有可能。 你可以试试看。

$payments = Payment::->select(*, DB::raw('DAY(date) AS day'))->get();

$grouped = $payments->groupBy('day');

dd($grouped->toArray());

答案 3 :(得分:0)

如果我没记错的话,可以这样分组:

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

这样,仅将日期的一天部分视为分组。