0

これらのモジュールがあるとしましょう:

  • クーポン
  • 注文 (.., Coupon_id)
  • アイテム (...、order_id、価格)

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

  • Coupon たくさんあり Orderます。
  • Order たくさんあり Itemます。

ここまでは順調ですね。

ここで、クーポンに属する注文に属するアイテムの価格を合計したいと考えています。そこで、次のようなことを考えました。

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

メソッドがリレーションのorders()a を返すため、うまくいきません。Collection

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

itemプロパティが保護されているというエラーが表示されます。Item私のモジュールとは関係がないことがわかりましCollectionprotected $items = [];

それで、いくつかの事実を明らかにした後、私の質問/問題は、に属する の をitems->priceどのように合計できますか?ordersCoupon


もちろん、次のような foreach ループを実行することで目標を達成できます。

$price = 0;

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

return $price;

しかし、私はよりクリーンなソリューションを探しています。誰?

4

1 に答える 1

10

それを達成するためのいくつかの方法:

$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');
于 2016-09-09T13:47:09.587 に答える