Php 跳过模型存取器

Php 跳过模型存取器,php,laravel,Php,Laravel,我得到了一个名为Run的模型,其中包含以下方法: public function getNameAttribute($name){ if($name == 'Eendaags') return $this->race_edition->race->name; return $this->race_edition->race->name.' '.$name; } 我需要这个laravel管理员设置,因为很多跑步都有相同的名称,

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

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

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

我需要这个laravel管理员设置,因为很多跑步都有相同的名称,唯一的区别是比赛名称。但在网站的一个地方,我只需要得到名字,没有变异。这可能吗?

这是正确的方法

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

编辑:小心

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

$this->attributes['name']
但是请注意,
attributes
是一个受保护的属性,因此不能从模型类之外执行此操作。在这种情况下,您可以使用

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

或者Maksym在下面的评论中的技巧。

我遇到了一个关于有说服力的访问器和表单模型绑定的问题-通过使用money_格式格式化整数,值不再加载到表单编号输入字段中

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

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

这在不影响表单模型绑定的情况下为我提供了一个访问器。

对于Laravel 7.15.0

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

// access it via
$user->originalName;

自Laravel 7.x以来,有一种访问完整属性的新方法:

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

您是否可以切换到使用只供管理员使用的
getNameRaceAttribute
功能,并将管理员设置为使用
->name\u race
字段,然后->name将与正常情况相同。在eloquent中没有“获取原始属性”函数。相关代码:尝试过此操作,但会带来其他问题。我想我需要在管理员中破解它。太棒了!!这正是我需要的,非常感谢。希望这是在文档中。@SteveBauman您可能遇到的一个问题是
getOriginal()
返回从数据库返回的原始值。因此,如果您有
name=something
,您将对其进行更改并调用
getOriginal('name')
您仍将获得
something
值。因此,您最好获取类似于
$name=array\u get($model->getAttributes(),'name')的值
通过这种方式,您将确保具有新值。
getOriginal()
是一个很好的函数,用于在观察者中检查新值与旧值的对比,因为Laravel 7.x
getOriginal()
将尊重强制转换和访问器
getRawOriginal()
将给出原始原始值。在7.x laravel中它对我有效
getOriginal()
无法绕过访问器在laravel 8上非常有效,谢谢!