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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel如何在Eloquent模型中添加自定义函数?相关的知识,希望对你有一定的参考价值。

我有一个产品型号

class Product extends Model
{
    ...

    public function prices()
    {
        return $this->hasMany('AppPrice');
    }

    ...
}

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

Product::find(1)->lowest;

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

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

但我得到一个错误说:

Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation

如果我使用Product::find(1)->lowest();,它会起作用。有可能让Product::find(1)->lowest;工作吗?

任何帮助,将不胜感激。

答案

当您尝试将模型中的函数作为变量访问时,laravel假定您正在尝试检索相关模型。他们称之为动态属性。您需要的是自定义属性。

将以下方法添加到您的模型:

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

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

Product::find(1)->lowest;
另一答案

使用Eloquent accessors

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

然后

$product->lowest;
另一答案

为什么你不这样做?我知道,这不是你要求的具体而且有时可能是一种不好的做法。但在你的情况下,我猜这很好。

$product = Product::with(['prices' => function ($query) {
   $query->min('price');
}])->find($id);
另一答案

您可以使用上述方法或使用以下方法将函数直接添加到现有模型中:

class Company extends Model
{
    protected $table = 'companies';

    // get detail by id
    static function detail($id)
    {
        return self::find($id)->toArray();
    }

    // get list by condition
    static function list($name = '')
    {
        if ( !empty($name) ) return self::where('name', 'LIKE', $name)->get()->toArray();
        else return self::all()->toArray();
    }
}

或使用Illuminate Support Facades DB;在你的功能里面。希望这能帮到别人。

以上是关于Laravel如何在Eloquent模型中添加自定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel Eloquent 中添加相关的聚合数据?

Laravel + Vue JS:从数据库中获取/存储 Eloquent 模型的值

如何在 Laravel 中定义 Eloquent 关系

如何在 Eloquent 模型中使用 Laravel Livewire?

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

如何模拟 Laravel Eloquent 模型的静态方法?