2016-09-09 18 views
0

のは、私はこれらのモジュールを持っているとしましょう:Laravel雄弁和関係のコラム

  • クーポン
  • 注文(..、coupon_id)
  • 項目(...、ORDER_ID、価格)

そして、それらの関係があります

  • Coupon多数ありOrder
  • Order多くてItemがあります。

これまでのところとても良いです。

今、私はクーポンに属する注文に属するアイテムの価格を合計したいと思います。だから私はこのような何かをやって考えた:

Coupon::orders->items->sum('price'); 

orders()方法は関係のCollectionを返すため、まあ、それは動作しません。

/** 
* @return \Illuminate\Database\Eloquent\Relations\HasMany 
*/ 
public function orders() 
{ 
    return $this->hasMany(Order::class); 
} 

私はitemプロパティをというエラーを取得しています保護されています。 Itemモジュールに関連していないことがわかりました。それはCollectionprotected $items = [];があるからです。

私はいくつかの事実を明らかにした後、Couponに属するordersitems->priceをどのように合計することができますか?

$price = 0; 

foreach (Coupon:orders as $order) 
    $price += $order->items->sum('price'); 

return $price; 

をしかし、私はクリーンな解決策を探しています:


もちろん私はこのようなforeachループを実行して、私の目標を達成することができます。誰でも?それを達成するために

答えて

5

、いくつかの方法:

$coupon_id; // the one you're looking for 

Item::whereHas('order', function ($q) use ($coupon_id) { 
    $q->where('coupon_id', $coupon_id); 
})->sum('items.price'); 

// OR 

// Coupon model 
public function items() 
{ 
    return $this->hasManyThrough(Item::class, Order::class); 
} 

Coupon::find($coupon_id)->items()->sum('price') // aggregate query 
Coupon::find($coupon_id)->items->sum('price') // sum on collection 

// OR 
Coupon::with('orders.items')->find($coupon_id)->orders->pluck('items')->collapse()->sum('price'); 
+0

私は番目のオプションを使用しました、ありがとうございます。 –