跳过模型访问器

时间:2013-07-09 08:49:35

标签: php laravel

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

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

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

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

4 个答案:

答案 0 :(得分:96)

这是正确的方法

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

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

修改 小心!

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

$this->attributes['name']

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

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

或Maksym的技巧来自他的评论。

答案 1 :(得分:10)

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

SQLERRM

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

答案 2 :(得分:2)

我遇到了Eloquent访问器和表单模型绑定的问题 - 通过使用money_format格式化整数,该值不再被加载到表单编号输入字段中。

我使用的解决方法是创建一个名称不同的访问者:

public function getRevenueDollarsAttribute($value)
{
    return money_format('$%i', $this->revenue);
}

这为我提供了一个访问器,而不会影响表单模型绑定。

答案 3 :(得分:1)

对于我的 Laravel 7.15.0

public function getOriginalNameAttribute()
{
    return $this->attributes['name'];
}

// access it via
$user->originalName;