2017-02-14 81 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();