使用Laravel Query Builder实现多列求和:查询指定客户关联订单的包裹统计值
实现方案
前置关联说明
基于你提供的表结构,预设三张表的关联逻辑如下:
- 客户表与订单表通过「客户ID」字段关联
- 订单表与包裹表通过「订单ID」字段关联
- 客户名称字段用于筛选客户为
A的过滤条件
Laravel Query Builder 实现代码
直接通过联表+聚合函数实现多字段同时求和:
use Illuminate\Support\Facades\DB; $statistics = DB::table('customers') // 关联客户对应的订单 ->join('orders', 'customers.id', '=', 'orders.customer_id') // 关联订单对应的包裹 ->join('parcels', 'orders.id', '=', 'parcels.order_id') // 筛选客户为A ->where('customers.customer_name', 'A') // 同时对两个字段求和 ->selectRaw( 'SUM(Total_Parcel_Value) as total_parcel_value, SUM(Total_Parcel_Delivery) as total_parcel_delivery' ) ->first();
取值方式
求和结果可直接通过返回对象获取:
- 所有包裹总价值:
$statistics->total_parcel_value - 所有包裹总配送费用:
$statistics->total_parcel_delivery
简化写法(已知客户ID的场景)
如果你已经提前拿到了客户A对应的ID,可以省去关联客户表的步骤,执行效率更高:
use Illuminate\Support\Facades\DB; // 假设客户A的ID为1 $statistics = DB::table('orders') ->join('parcels', 'orders.id', '=', 'parcels.order_id') ->where('orders.customer_id', 1) ->selectRaw( 'SUM(Total_Parcel_Value) as total_parcel_value, SUM(Total_Parcel_Delivery) as total_parcel_delivery' ) ->first();
注意:如果存在订单没有对应包裹的场景,可以将
join替换为leftJoin,无包裹的订单对应求和结果会返回0,不会漏掉对应订单。
内容的提问来源于stack exchange,提问作者Junior Frogie
相关产品推荐
相关产品推荐

