2017-02-14 85 views
1
类别

我的工作,需要我产生一个类似的报告,项目查询月度数据:Laravel - 有效途径每

Category  Total Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 
----------------------------------------------------------------------- 
Category 1  97  10 10 10 10 10 5 10 10 7 5 5 5 
Category 2  120  10 10 10 10 10 10 20 10 5 5 10 10 
Category 3  5  0 0 0 3 0 2 0 0 0 0 0 0 

这份报告需要从类似这样的数据产生的:

id  category_id  type year month  amount 
---------------------------------------------------------- 
1  1    16  2016 1   4 
2  1    23  2016 1   6 
3  1    76  2016 2   3 
4  1    27  2016 2   3 
5  1    18  2016 2   4 

报告,每个月的数量仅仅是amount的该特定类别,年份和月份的总和。我可以通过查询每个月和每个类别的数据库来做到这一点,但是如果我需要生成大约一百个类别的报告,这种方法不能很好地扩展,因为它需要超过1,200个查询(100个类别X 12个月)!

有关如何提高效率的任何建议?

谢谢!

+1

是的。一本体面的书或教程应该帮助那个 – Strawberry

回答

1

该解决方案是由两列组成的。我添加了必要的代码来格式化结果,只要你想。

Item::where('year', $year) 
     ->groupBy('month', 'category_id') 
     ->selectRaw('sum(amount) as sum, month, category_id') 
     ->orderBy('category_id') 
     ->orderBy('month') 
     ->get() 
     ->groupBy('category_id') 
     ->map(function($item){ 
       $item = $item->pluck('sum', 'month'); 
       $item['total'] = $item->sum(); 
       return $item; 
      }); 
+0

这正是我正在寻找的!我已经知道我可以将我的结果分组在一起,但最终的映射部分是我希望有人能提供的。谢谢! – BakerStreetSystems

1

这是你在找什么?

Category::where('year', 2016) 
    ->select('month', 'year', DB::raw('SUM(amount) as amountTotal')) 
    ->groupBy('month', 'year') 
    ->get();