Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Skip model accessor

Tags:

php

laravel

I got a model called Run which contains this method:

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

I need this setup for laravel administrator, since alot of runs will have the same name and the only difference is the race name. But in 1 place in the website i need to get the name only, without mutating. Is this possbile?

like image 839
LHolleman Avatar asked Jul 09 '13 08:07

LHolleman


2 Answers

this is the correct way

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

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

Edit: Careful!

As Maksym Cierzniak explained in the comments, getOriginal() doesn't just skip mutators, it also returns the "original" value of the field at the time the object was read from the database. So if you have since modified the model's property, this won't return your modified value, it will still return the original value. The more consistent and reliable way to get the un-mutated value from within the model class is to retrieve it from the attributes property like this:

$this->attributes['name'] 

But be aware that attributes is a protected property, so you can't do that from outside the model class. In that case, you can use

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

or Maksym's technique from his comment below.

like image 98
alioygur Avatar answered Sep 17 '22 17:09

alioygur


since Laravel 7.x and 8.x there is a new approach to access intact attribute:

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

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

like image 33
saber tabatabaee yazdi Avatar answered Sep 16 '22 17:09

saber tabatabaee yazdi