Php Laravel查询生成器-求和位置和求和位置

Php Laravel查询生成器-求和位置和求和位置,php,laravel,eloquent,query-builder,laravel-query-builder,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 |

我有一张名为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之和

i、 e。 按产品、类型分组 每种类型的总数量

关键是,这是一个针对产品的集合,这是我正在努力解决的问题。有人有什么建议吗

到目前为止我已经

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

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

您需要一个基本的pivot查询,它在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查询。

您需要一个基本的pivot查询,它在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查询。

使用原始表达式

  $result = DB::table('stock_movements')
                ->select(DB::raw('sum(qty) as sum_qty, type'))
                ->groupBy('type')
                ->get();
在SELECT子句中使用聚合函数的经验法则

如果select块没有GROUP BY子句,则任何列 SELECT子句中指定的规范必须作为 聚合函数或给定列列表中的参数 在GROUP BY子句中,或在两者中

有关详细信息: 使用原始表达式

  $result = DB::table('stock_movements')
                ->select(DB::raw('sum(qty) as sum_qty, type'))
                ->groupBy('type')
                ->get();
在SELECT子句中使用聚合函数的经验法则

如果select块没有GROUP BY子句,则任何列 SELECT子句中指定的规范必须作为 聚合函数或给定列列表中的参数 在GROUP BY子句中,或在两者中

有关详细信息:

可能按类型分组?可能按类型分组?这很有效,谢谢。但是,如果sum_a和sum_b的和都为0,它也会返回结果。有没有办法排除这些因素?@AdamLambert Yes使用
->having('sum_a','>',0)->havingRaw('sum_b','>',0)
,或者使用
->havingRaw('sum(当类型为'a'时,数量为0结尾)>,[0])
这很有效,谢谢。但是,如果sum_a和sum_b的和都为0,它也会返回结果。有没有办法排除这些因素?@AdamLambert Yes使用
->having('sum_a','>',0)->havingRaw('sum_b','>',0)
,或者使用
->havingRaw('sum(当类型为'a'时,则数量为0结尾)>,[0])