Laravel通过引用其他列获取列的SUM

kmbjn2e3  于 2023-06-30  发布在  其他
关注(0)|答案(4)|浏览(112)

我有一个名为transaction的表(型号:交易)。下面是我的表结构:
| 数量| Quantity |
| --| ------------ |
| + | 10 |
| - | 4 |
| + | 15 |
| - | 15 |
这里我想要总量的和,其中所有的-应该被减去,所有的+应该被添加。我怎么能得到?
我已经添加了所有的+(这是购买)和减去-(这是销售),使用2种不同的查询方式:Transation::sum('Quantity')->where('Type','+') - Transation::sum('Quantity')->where('Type','-')
有没有比多个查询更好的单一查询?

gupuwyp2

gupuwyp21#

您可以使用selectRaw直接对查询执行计算,并执行sql语法。

return Transaction::selectRaw("(
        SUM(CASE WHEN Type = '+' THEN Quantity END) - 
        SUM(CASE WHEN Type = '-' THEN Quantity END) 
    ) as total")
    ->get();

或者将表按Type分组,然后在laravel集合中执行计算

$data = Transaction::select('Type as operator')
    ->selectRaw('sum(Quantity) as total')
    ->groupBy('operator')
    ->get();

// here transform the collection as a signed integer value like [-10, +10] then add them all by calling sum
return $data->map( fn( $i) => (int) ($i->operator . $i->total) )->sum();
yhuiod9q

yhuiod9q2#

这可以通过使用雄辩模型访问数据来完成。然后,您可以通过访问属性并基于此进行操作来遍历每个属性并检查值。
关于使用Model::all()的注意事项,如果你有很多元素,你应该使用chunkall()会将所有数据加载到内存中,过多的条目可能会超过内存。你可以在这里阅读更多:Select all from table with Laravel and Eloquent

$rows = Transation::all();
  
$total = 0;
   
$rows->each(function($row)
{
    switch($row->Type)
    {
        case '+':
            $total += $row->Quantity;
            break;
        case '-';
            $total -= $row->Quantity;
            break;
    }   
}
3duebb1j

3duebb1j3#

是的,你可以,你使用Laravel雄辩地选择原始,这将允许你使用case就像switch语句一样,这是一个例子
$totalQuantity = DB::select(DB::raw('SELECT SUM(CASE WHEN Type = \'+\' THEN Quantity ELSE -Quantity END) AS total_quantity FROM transactions'))[0]->total_quantity;

eqqqjvef

eqqqjvef4#

尝试在MySQL中使用Laravel的selectRaw进行计算

Transaction::selectRaw('SUM(CONCAT(type, quantity)) AS total')->first()->total ?? 0

相关问题