我有两个型号。一个是Order
,另一个是Item
。订单可以包含多个商品,而商品只能包含一个订单。
我在订单模型中有这个:
public function items() {
return $this->hasMany('App\Item', 'OrderNumber', 'OrderNumber');
}
这是我的物品型号:
function order() {
return $this->belongsTo('App\Order');
}
我希望有一个能够获得订单所有商品总数的功能。例如,我希望能够使用$order->items->totalPrice()
来检索总数。
我尝试将其添加到Item模型中,但没有运气。
public function totalPrice() {
$total = 0;
foreach($this as $item) {
$total += $item->AmountPaid;
}
return $total;
}
这是我得到的错误:
Undefined property: Illuminate\Database\Eloquent\Collection::$totalPrice
做我想要达到的目标的最佳/最干净的方法是什么?更好的是,Laravel是否有内置的总计方法?
答案 0 :(得分:4)
您可以从Order
访问此内容(因为此关系的动态属性将返回Collection
,我们可以使用sum
方法来帮助我们:
public function totalPrice()
{
return $this->items->sum('AmountPaid');
}
然后在Order
个实例上调用它。
$order->totalPrice();
如果您要检索大量Order
条记录并通过它们来获取这些记录,您将需要急切加载该关系以避免N + 1.
$orders = Order::with('items')->....->get();
答案 1 :(得分:2)
您可以尝试这样的事情:
$order = Order::with('items')->find(10);
$total = $order->totalPrice();
在订单模型中,您需要写:
public function totalPrice()
{
$total = 0;
if (!empty($this->items)) {
foreach($this->items as $item) {
$total += $item->AmountPaid;
}
}
return $total;
}
不是最优雅的方式,但可能值得研究。