我正在尝试对表以及相关表中的数据进行分组时对一列求和。
订单表
订购商品表
关系
订单商品属于订单
public function order() : BelongsTo
{
return $this->belongsTo(Order::class);
}
查询
我正在寻找以下结果:
以下内容获取具有正确组的集合:
$items = OrderItem::with(['order'])
->get()
->groupBy(['fulfilment_location_id', 'product_id']);
然后,我可以遍历此数组以获取所需的结果,如下所示:
$result = [];
foreach($items as $location_id => $products_collection){
foreach($products_collection as $product_id => $order_items_collection){
$sum = $order_items_collection->sum(function(OrderItem $oi){
return $oi->qty;
});
isset($result[$location_id][$product_id]) ?
$result[$location_id][$product_id] += $sum :
$result[$location_id][$product_id] = $sum;
}
}
...但是,这似乎很漫长。通过将orders表中的location_id列复制到order_items表中,我可以使结果容易得多,但这感觉不太好。我希望会有一种更简单的使用口才的方法(与编写原始查询相反)。
答案 0 :(得分:1)
类似的事情:
$items = OrderItem::select(DB::raw('sum(order_items.qty) as sumqty, o.location_id as lcoation, order_items.product_id as product_id'))
->leftJoin('orders as o', 'o.id', 'order_items.order_id')
->groupBy(['product_id', 'lcoation']);
应该给你:
sumqty | location | product_id
---------------------------------
12 3 12 // example data