Php Laravel通过其他关系雄辩求和关系的列
假设我有这些模块: 息票 订单号、优惠券号 项目…,订单号,价格 这些关系是: 优惠券有很多订单。 订单上有很多项目。 到目前为止还不错 现在,我想对属于优惠券的订单的项目的价格求和。所以我想做这样的事情:Php Laravel通过其他关系雄辩求和关系的列,php,laravel,eloquent,laravel-collection,Php,Laravel,Eloquent,Laravel Collection,假设我有这些模块: 息票 订单号、优惠券号 项目…,订单号,价格 这些关系是: 优惠券有很多订单。 订单上有很多项目。 到目前为止还不错 现在,我想对属于优惠券的订单的项目的价格求和。所以我想做这样的事情: Coupon::orders->items->sum('price'); $price = 0; foreach (Coupon:orders as $order) $price += $order->items->sum('price'); retur
Coupon::orders->items->sum('price');
$price = 0;
foreach (Coupon:orders as $order)
$price += $order->items->sum('price');
return $price;
因为orders方法返回关系的集合,所以它不起作用:
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function orders()
{
return $this->hasMany(Order::class);
}
我收到一个错误,说项目属性受保护。我发现它与我的Item模块无关,只是因为集合保护了$items=[]
所以,在我澄清了一些事实之后,我的问题是,如何计算属于优惠券的订单的项目->价格
当然,我可以通过这样的foreach循环来实现我的目标:
Coupon::orders->items->sum('price');
$price = 0;
foreach (Coupon:orders as $order)
$price += $order->items->sum('price');
return $price;
但我正在寻找一个更干净的解决方案。有人吗?实现这一目标的几种方法:
$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');
谢谢,我用了第三个选项。