Laravel查询生成器-总和和总和

时间:2018-07-18 15:29:09

标签: php laravel eloquent query-builder laravel-query-builder

我有一个名为stock_movements的表:

| product_id | type | qty  |
|------------|------|------|
| 1          | A    | 2    |
| 1          | A    | 1    |
| 1          | A    | 7    |
| 1          | B    | -2   |
| 1          | B    | -4   |
| 1          | B    | -1   |
| 2          | A    | 2    | 
| 2          | A    | 1    |
| 2          | A    | 7    | 
| 2          | B    | -3   | 
| 2          | B    | -3   |
| 2          | B    | -1   |

我正在尝试创建一个产品集合,这些产品的值分别为A和B的总和。

即 按产品分组,类型 每种类型的总数量

关键是它是针对产品的收藏品,这是我努力奋斗的目标。有人有什么建议吗?

到目前为止,我已经...

    return $this->stockMovements()->groupBy('product_id')
        ->selectRaw('sum(qty), product_id')
        ->where('type', $this->type)
        ->get();

但是对于类型A和类型B,这并不分开。

2 个答案:

答案 0 :(得分:2)

您需要一个基本的数据透视查询,在Laravel中看起来像这样:

return $this->stockMovements()
        ->selectRaw("SUM(CASE WHEN type = 'A' THEN qty ELSE 0 END) AS sum_a, ".
                    "SUM(CASE WHEN type = 'B' THEN qty ELSE 0 END) AS sum_b, product_id")
        ->groupBy('product_id')
        ->get();

我删除了WHERE子句,因为您的数据似乎只有两种类型,并且对其进行限制没有多大意义。如果您真的只希望A或B的数量总和,那么我们可以编写一个更简单的Laravel / MySQL查询。

答案 1 :(得分:0)

使用原始表达式

  $result = DB::table('stock_movements')
                ->select(DB::raw('sum(qty) as sum_qty, type'))
                ->groupBy('type')
                ->get();

在SELECT子句中使用聚合函数的经验法则

  

如果选择块确实具有GROUP BY子句,则任何列   SELECT子句中指定的规范必须专门作为   聚合函数的参数或给定列的列表中   在GROUP BY子句中,或同时在两者中。

有关更多详细信息: http://www.informit.com/articles/article.aspx?p=664143&seqNum=6