首页 > 解决方案 > Laravel 雄辩查询返回月订单总和

问题描述

到目前为止,我提出了这个查询:

Order::select(DB::raw('sum(price) as sums'), 
              DB::raw("DATE_FORMAT(created_at,'%e') as day")                                             
             )
             ->where('seller_id', Auth::user()->id)
             ->whereBetween('created_at', [Carbon::now()->startOfMonth()
             ->subMonth(),Carbon::now()->endOfMonth()->subMonth()])
             ->orderBy('created_at', 'asc')
             ->groupBy('day')
             ->get();

这将返回一个像这样的数组:

[{"sums":145867,"day":"3"},{"sums":19567,"day":"28"}]  

这几乎是我需要的。我现在想在这些结果中包含月份的名称,如下所示:

[{"June" : {{"sums":145867,"day":"3"},{"sums":19567,"day":"28"}}}]  

标签: laraveleloquent

解决方案


简单,将月份添加到您的选择并使用集合方法 mapToGroups

如果您不想在结果数组中看到月份数 - 在回调中格式化结果数组

...
DB::raw("DATE_FORMAT(created_at,'%c') as month")  
...
->get()
->mapToGroups(function ($item, $key) {
    return [Carbon\Carbon::create()->month($item['month'])->format('M') => $item];
});

您也可以使用 DATE_FORMAT(created_at,'%b') 作为 MySQL 中的月份名称,并且不要在回调中使用 Carbon,但是,在我看来,这对可能的本地化不利。但是这种方式性能更有效


推荐阅读