以雄辩的关系创建方法

时间:2017-12-07 11:14:36

标签: php laravel eloquent

我有两个型号。一个是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是否有内置的总计方法?

2 个答案:

答案 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;
}

不是最优雅的方式,但可能值得研究。