簡體   English   中英

Laravel 5.6 / Eloquent Sum 和 GroupBy 與相關表/關系

[英]Laravel 5.6 / Eloquent Sum and GroupBy with related tables/relationships

我試圖在按表中的數據以及相關表進行分組時對一列求和。

訂單表

  • ID
  • location_id
  • 收到的日期

訂購項目表

  • ID
  • 訂單編號
  • 產品編號
  • 數量

關系

訂單項屬於訂單

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

詢問

我正在尋找以下結果:

  • product_id(order_items 表上的 groupBy)
  • 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;
    }
}

...然而這似乎很啰嗦。 通過將 location_id 列從 orders 表復制到 order_items 表,我可以更容易地獲得結果,但這感覺不太好。 我希望有一種更簡單的方式來使用 eloquent(與編寫原始查詢相反)。

類似的東西:

$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  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM