Laravel价格计算

时间:2016-12-29 11:07:58

标签: php laravel eloquent

我试图通过以下方法计算订单的总和: Laravel Eloquent: Best Way to Calculate Total Price

我希望计算在模型中完成,因此我可以在多个控制器中使用它。

我的代码如下所示:

class Order extends Model
{
    public function customer()
    {
        return $this->belongsTo('App\Customer');
    }

    public function orderItems()
    {
        return $this->hasMany('App\OrderItem');
    }

    public function total()
    {
        return $this->orderItems->sum(function($orderItem)
            {
                return $orderItem->net_price;
            });
    }
}

所以我认为我已经完成了与示例中完全相同的所有操作,但我收到了以下错误:

  

Model.php第2696行中的ErrorException:关系方法必须返回   一个类型为Illuminate \ Database \ Eloquent \ Relations \ Relation

的对象

任何帮助都将受到高度赞赏 感谢。

4 个答案:

答案 0 :(得分:0)

怎么样:

public function total() {
    return $this->orderItems->sum('net_price');
}

答案 1 :(得分:0)

问题在于你hasMany关系。试试这个:

public function orderItems()
{
    return $this->hasMany(App\OrderItem::class, 'order_id');
}

当然,您必须将order_id更改为包含OrderItem表中信息的名称。

答案 2 :(得分:0)

似乎功能是正确的,问题是我改变它后,我调用它的视图没有正确上传。视图中的调用必须是{{$ order-> total()}}

感谢您的帮助!

答案 3 :(得分:0)

Joha,当你使用十进制值时,我会非常小心地使用集合上的sum函数。如果使用整数值,则无关紧要。

您可能会发现sum函数有时会错误计算总和,并为您留下奇怪的数字,如59.999999999998184。这是因为十进制操作在计算机中不是很稳定,因此您必须循环每个项目并使用 bcmath 来避免这种情况。即使您现在没有体验它,随着应用程序的增长,这也会成为一个问题。

这将是一个更安全的&准确的例子:

class Order extends Model{

    public function customer()
    {
        return $this->belongsTo('App\Customer');
    }

    public function orderItems()
    {
        return $this->hasMany('App\OrderItem');
    }

    public function getTotalAttribute() {
        $totalPrice = 0;

        foreach ($this->orderItems as $orderItem) {
            $totalPrice = bcadd($totalPrice, $orderItem->net_price, 2);
        }

        return $totalPrice;
    }
}

我还将函数重构为一个属性,如代码示例所示。这允许您访问$order->total,就像它是模型上的属性一样。