Laravel - 查询每个类别每月数据的有效方法

时间:2017-02-14 21:39:34

标签: php mysql 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个月)!

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

谢谢!

2 个答案:

答案 0 :(得分: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;
            });

答案 1 :(得分:1)

这是你要找的吗?

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