Laravel 如何在 Eloquent 模型中添加自定义函数?

2022-08-30 18:02:06

我有一个产品模型

class Product extends Model
{
    ...

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

    ...
}

我想添加一个将返回最低价格的函数,在控制器中,我可以使用以下命令获取值:

Product::find(1)->lowest;

我在产品模型中添加了这个:

public function lowest()
{
    return $this->prices->min('price');
}

但我得到了一个错误说:

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

如果我使用,它将起作用。有可能去上班吗?Product::find(1)->lowest();Product::find(1)->lowest;

任何帮助将不胜感激。


答案 1

当您尝试以变量形式访问模型中的函数时,laravel 会假定您正在尝试检索相关模型。它们称为动态属性。相反,您需要的是自定义属性。

在拉拉维尔之前 9

拉拉维尔 6 个文档: https://laravel.com/docs/6.x/eloquent-mutators

将以下方法添加到模型中:

public function getLowestAttribute()
{
    //do whatever you want to do
    return 'lowest price';
}

现在,您应该能够像这样访问它:

Product::find(1)->lowest;

编辑:拉拉维尔9的新功能

Laravel 9 提供了一种处理属性的新方法:

文档: https://laravel.com/docs/9.x/eloquent-mutators#accessors-and-mutators

// use Illuminate\Database\Eloquent\Casts\Attribute;

public function lowest(): Attribute
{
     return new Attribute(
        get: function( $originalValue ){
         //do whatever you want to do
         //return $modifiedValue;
      });

     /**
      * Or alternatively:-
      *
      * return Attribute::get( function( $originalValue ){
      *    // do whatever you want to do
      *    // return $modifiedValue;
      * });
      */
}

答案 2

使用雄辩的访问器

public function getLowestAttribute()
{
    return $this->prices->min('price');
}

然后

$product->lowest;

推荐