跳过模型访问器

LHo*_*man 35 php laravel

我有一个名为Run的模型,其中包含以下方法:

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

    return $this->race_edition->race->name.' '.$name;
}
Run Code Online (Sandbox Code Playgroud)

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

ali*_*gur 113

这是正确的方法

// that skips mutators
$model->getOriginal('name');
Run Code Online (Sandbox Code Playgroud)

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

编辑: 小心!

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

$this->attributes['name']
Run Code Online (Sandbox Code Playgroud)

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

$model->getAttributes()['name']`
Run Code Online (Sandbox Code Playgroud)

或者Maksym的技巧来自他的评论.

  • @SteveBauman你可能遇到的一个问题是``getOriginal()``返回从数据库返回的原始值.因此,如果你有``name = something``并且你将改变它并调用``getOriginal('name')``你仍然会得到``something``值.所以你最好抓住像``$ name = array_get($ model-> getAttributes(),'name')这样的值;``这样你就可以确定你有新的价值. (10认同)
  • `getOriginal()` 是一个很棒的函数,可以在观察者中使用来检查新值与旧值 (2认同)

sab*_*zdi 26

从 Laravel 7.x 和 8.x 开始,有一种访问完整属性的新方法:

// that skips accessors
$model->getRawOriginal('name');
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,自 Laravel 7.x `getOriginal() ` 将尊重强制转换和访问器。`getRawOriginal()` 将给出原始原始值。 (4认同)
  • 它对我有用,在 7.x laravel `getOriginal()` 中无法绕过访问器 (3认同)
  • 在 Laravel 8 上运行得很好,谢谢! (2认同)