Laravel如何用withSum按status条件统计关联表两列乘积的加减总和
解决方案
方式1:使用withSum结合原生表达式(推荐,适配预加载统计需求)
你可以直接在withSum方法中传入带自定义查询逻辑的闭包,配合SQL的CASE WHEN条件语句实现差异化统计:
- 先引入DB门面:
use Illuminate\Support\Facades\DB;
- 执行查询:
$warehouses = Warehouse::withSum([ // 别名 total_actual_amount 为统计结果的字段名,可自行修改 'sales as total_actual_amount' => function ($query) { $query->select(DB::raw( 'SUM( CASE WHEN status = 1 THEN product_price * quantity WHEN status = 2 THEN - (product_price * quantity) ELSE 0 END )' )); } ])->get();
查询完成后,每个Warehouse实例都会携带total_actual_amount属性,值就是你需要的统计结果。
方式2:单个仓库实例的单独统计
如果你已经获取了某个指定仓库的实例,也可以直接通过关联关系做单次统计:
// $warehouse 为已查询得到的指定仓库实例 $totalActualAmount = $warehouse->sales() ->selectRaw( 'SUM( CASE WHEN status = 1 THEN product_price * quantity WHEN status = 2 THEN - (product_price * quantity) ELSE 0 END ) as total' ) ->value('total');
注意:如果
product_price为浮点类型,建议提前将字段调整为DECIMAL类型,避免统计时出现浮点精度误差。
内容的提问来源于stack exchange,提问作者Othmane
相关产品推荐
相关产品推荐

