Laravel Eloquent сумма отношения столбца через другое отношение

Допустим, у меня есть эти модули:

  • Купон
  • Заказ (.., coupon_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 модуль, это только потому, что Collection имеет protected $items = [];,

Итак, после того, как я выяснил некоторые факты, мой вопрос / проблема заключается в том, как я могу суммировать items->price из orders которые принадлежат Coupon?


Конечно, я могу достичь своей цели, выполнив цикл foreach следующим образом:

$price = 0;

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

return $price;

Но я ищу более чистое решение. Кто-нибудь?

0

Решение

Несколько способов добиться этого:

$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');
7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]