66

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

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

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

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

4

4 回答 4

172

这是正确的方法

// 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的技术。

于 2013-09-16T08:43:22.333 回答
36

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

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

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

于 2020-08-13T07:25:09.887 回答
3

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

我正在使用的解决方法是创建一个具有不同名称的访问器:

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

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

于 2015-09-23T21:18:02.747 回答
1

就我而言,Laravel 7.15.0

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

// access it via
$user->originalName;
于 2020-06-16T16:28:12.577 回答