Laravel中如何获取关联内line_total总和并展示在订单主信息层级
方案1:基于查询结果集合计算(适合已加载全部订单明细的场景)
拿到查询结果后直接调用集合的sum方法计算明细行总金额,代码改动最小:
$order = $this->model ->select('orderNumber','orderNumber as order_id','orderDate as order_date','status') ->where('orderNumber','=',$id) ->with(array('OrderDetail'=>function($query){ $query->select('productCode','orderNumber','priceEach as unit_price',DB::raw('quantityOrdered*priceEach as line_total')); })) ->with('customer') ->first() ->makeHidden(['orderNumber']); // 追加订单总金额字段 $order->order_total = $order->OrderDetail->sum('line_total'); return $order;
方案2:SQL层面直接关联计算总和(性能更优)
使用Laravel的withSum方法直接在查询阶段计算总金额,不需要依赖已加载的明细数据,数据量较大时性能更好:
return $this->model ->select('orderNumber','orderNumber as order_id','orderDate as order_date','status') ->where('orderNumber','=',$id) ->with(array('OrderDetail'=>function($query){ $query->select('productCode','orderNumber','priceEach as unit_price',DB::raw('quantityOrdered*priceEach as line_total')); })) // 关联计算订单总金额 ->withSum(['OrderDetail as order_total' => function($query) { $query->select(DB::raw('SUM(quantityOrdered * priceEach)')); }]) ->with('customer') ->first() ->makeHidden(['orderNumber']);
两种方案返回的结构都会在订单根节点下新增order_total字段存储所有明细line_total的总和,符合输出要求。
内容的提问来源于stack exchange,提问作者Virajee Amarasinghe
相关产品推荐
相关产品推荐

