2013-07-09 36 views
19

我有一个模式叫润包含此方法:跳过模式访问

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

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

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

+0

您可以切换到使用'getNameRaceAttribute'函数,该函数仅供管理员使用,并且设置管理员使用' - > name_race'字段,然后 - >名称将像通常一样。雄辩中没有“获取原始属性”功能。相关的代码:https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php#L1839 –

+0

试过这个,但它会带来其他问题。我想我需要在管理员中破解它。 – LHolleman

回答

63

这是正确的方式

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

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

编辑:小心!

由于马克西姆Cierzniak在评论中解释说,getOriginal()并不仅仅跳过存取器,它也是在对象是从数据库中读取时返回字段的“原始”值。所以,如果你已经修改了模型的属性,这将不会返回你的修改值,它仍然会返回原始值。更一致和可靠的方式来从模型类中获取未突变值是从attributes财产这样获取:

$this->attributes['name'] 

但要知道,attributes是一个受保护的财产,这样你就可以”不要从模型课以外做到这一点。在这种情况下,您可以使用

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

或Maksym的技术从他的评论下面。

+1

真棒!这正是我需要的,非常感谢。希望这是在文档中。 –

+6

@SteveBauman您可能遇到的一个问题是''getOriginal()''返回从数据库返回的原始值。所以如果你有''name = something'',你会改变它并调用''getOriginal('name')'',你仍然会得到''something''的值。所以你最好像''name = array_get($ model-> getAttributes(),'name');''''''''''''''''''''''''''' –

+0

良好的信息。这应该被标记为可接受的答案。 –

0

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

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

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

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