Laravel带条件计算两列乘积和 实现各仓库总收入统计
解决方案
你可以直接基于已获取的Warehouse集合,使用Laravel集合内置的遍历和求和方法完成自定义规则的收入计算,实现代码如下:
方案1:基于已加载关联的集合做计算(符合你要的集合实现需求)
// 你原本获取Warehouse集合的代码,已经预加载了sales关联 $warehouses = Warehouse::with('sales')->get(); $warehouses = $warehouses->map(function ($warehouse) { // 按规则计算单仓库总收入 $totalRevenue = $warehouse->sales->sum(function ($sale) { $itemAmount = (float)$sale->price * $sale->quantity; return $sale->status === 1 ? $itemAmount : -$itemAmount; }); // 将计算结果挂载到仓库对象属性上 $warehouse->total_revenue = $totalRevenue; return $warehouse; });
处理完成后,你可以直接通过$warehouse->total_revenue获取对应仓库的总收入,计算结果和你给出的示例完全一致。
方案2:查询阶段直接完成计算(适合数据量较大的场景)
如果你的数据量较大,不希望把所有销售记录加载到内存中计算,可以使用withAggregate方法在数据库查询层面完成计算,性能更高:
use Illuminate\Support\Facades\DB; $warehouses = Warehouse::withAggregate('sales as total_revenue', function ($query) { $query->select(DB::raw( 'SUM(CASE WHEN status = 1 THEN price * quantity WHEN status = 2 THEN -price * quantity ELSE 0 END)' )); })->get();
内容的提问来源于stack exchange,提问作者Othmane
相关产品推荐
相关产品推荐

