Laravel 5.6 /雄辩的总和和GroupBy及其相关的表/关系

时间:2018-12-31 15:07:16

标签: php laravel eloquent

我正在尝试对表以及相关表中的数据进行分组时对一列求和。

订单表

  • id
  • location_id
  • 接收日期

订购商品表

  • id
  • order_id
  • product_id
  • 数量

关系

订单商品属于订单

public function order() : BelongsTo
{
    return $this->belongsTo(Order::class);
}

查询

我正在寻找以下结果:

  • product_id(group_by order_items表)
  • location_id(groupBy在订单表上)
  • 数量(order_items表上的总和)

以下内容获取具有正确组的集合:

$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表中,我可以使结果容易得多,但这感觉不太好。我希望会有一种更简单的使用口才的方法(与编写原始查询相反)。

1 个答案:

答案 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