跳过模型访问器

2022-08-30 08:49:08

我得到了一个名为Run的模型,其中包含此方法:

public function getNameAttribute($name){
    if($name == 'Eendaags')
        return $this->race_edition->race->name;

    return $this->race_edition->race->name.' '.$name;
}

我需要为laravel管理员设置,因为很多运行将具有相同的名称,唯一的区别是种族名称。但是在网站的1个地方,我只需要获得名称,而不会发生变化。这是可能的吗?


答案 1

这是正确的方法

// that skips mutators
$model->getOriginal('name');

https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_getOriginal

编辑:小心!

正如Maksym Cierzniak在评论中解释的那样,它不仅跳过了突变体,还返回从数据库中读取对象时字段的“原始”值。因此,如果您修改了模型的属性,则不会返回修改后的值,它仍将返回原始值。从模型类中获取未变异值的更一致和可靠的方法是从属性中检索它,如下所示:getOriginal()attributes

$this->attributes['name']

但请注意,这是受保护的属性,因此不能从模型类外部执行此操作。在这种情况下,您可以使用attributes

$model->getAttributes()['name']`

或者Maksym的技术来自他下面的评论。


答案 2

由于Laravel 7.x和8.x有一种新的方法来访问完整的属性:

// that skips accessors
$model->getRawOriginal('name');

https://laracasts.com/discuss/channels/testing/how-to-disable-casting-during-testing


推荐