0

假设我有这些模块:

  • 优惠券
  • 订单 (.., 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模块无关,只是因为Collectionhas protected $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 回答