Holleman
Obtuve un modelo llamado Ejecutar que contiene este método:
public function getNameAttribute($name){
if($name == 'Eendaags')
return $this->race_edition->race->name;
return $this->race_edition->race->name.' '.$name;
}
Necesito esta configuración para el administrador de laravel, ya que muchas carreras tendrán el mismo nombre y la única diferencia es el nombre de la carrera. Pero en 1 lugar en el sitio web necesito obtener solo el nombre, sin mutar. ¿Es esto posible?
alioygur
esta es la forma correcta
// that skips mutators
$model->getOriginal('name');
https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_getOriginal
Editar: ¡Cuidadoso!
Como explicó Maksym Cierzniak en los comentarios, getOriginal()
no solo omite los mutadores, sino que también devuelve el valor “original” del campo en el momento en que se leyó el objeto de la base de datos. Entonces, si desde entonces ha modificado la propiedad del modelo, esto no devolverá su valor modificado, aún devolverá el valor original. La forma más consistente y confiable de obtener el valor no mutado dentro de la clase del modelo es recuperarlo del attributes
propiedad como esta:
$this->attributes['name']
Pero ten en cuenta que attributes
es una propiedad protegida, por lo que no puede hacerlo desde fuera de la clase del modelo. En ese caso, puede utilizar
$model->getAttributes()['name']`
o la técnica de Maksym de su comentario a continuación.
-
¡¡Impresionante!! Esto es exactamente lo que necesito, muchas gracias. Ojalá esto estuviera dentro de la documentación.
–Steve Bauman
19 de enero de 2015 a las 16:32
-
@SteveBauman Un problema que puede encontrar es que
getOriginal()
devuelve el valor original de la base de datos. entonces si tienesname=something
y lo cambiaras y llamarasgetOriginal('name')
todavía obtendrás elsomething
valor. Así que es mejor que tomes el valor como$name = array_get($model->getAttributes(), 'name');
De esta manera, estará seguro de que tiene el valor fresco.– Maksim
2 de julio de 2015 a las 8:59
-
getOriginal()
es una gran función para usar en Observers para verificar cuál era el nuevo valor en comparación con el anterior–Mike Harrison
6 de julio de 2018 a las 4:22
-
getOriginal no funcionará si aún no proviene de la base de datos. Sin embargo, ¡getAttributes() funciona!
– Erik Campobadal
16 de marzo a las 14:14
sable tabatabaee yazdi
desde Laravel 7.x y 8.x hay un nuevo enfoque para acceder al atributo intacto:
// that skips accessors
$model->getRawOriginal('name');
https://laracasts.com/discuss/channels/testing/how-to-disable-casting-when-testing
-
Sí desde Laravel 7.x
getOriginal()
se respetarán los moldes y los accesores.getRawOriginal()
dará el valor original sin procesar.– Jino Antonio
19 de agosto de 2020 a las 7:13
-
funciona para mí, en 7.x laravel
getOriginal()
no se pueden omitir los accesores– Criss Ira
20 oct 2020 a las 17:27
-
Esta debería ser la respuesta correcta.
– Lucas M. Oliveira
9 de febrero a las 6:12
-
@LucasM.Oliveira si sabemos que esta respuesta es correcta podemos compartirla en su red social en LinkedIn o etc, por favor. si puede hacer esto, ayude a otros a encontrar la respuesta antes. 😉
– saber tabatabaee yazdi
18 de febrero a las 17:05
Me encontré con un problema con los accesos Eloquent y el enlace del modelo de formulario: al formatear un número entero con money_format, el valor ya no se cargaba en el campo de entrada del número de formulario.
La solución que estoy usando es crear un descriptor de acceso con un nombre diferente:
public function getRevenueDollarsAttribute($value)
{
return money_format('$%i', $this->revenue);
}
Esto me proporciona un acceso sin afectar el enlace del modelo de formulario.
en mi caso por Laravel 7.15.0
public function getOriginalNameAttribute()
{
return $this->attributes['name'];
}
// access it via
$user->originalName;
¿Podría cambiar a usar un
getNameRaceAttribute
función, diseñada para ser utilizada solo por el administrador, y configurar el administrador para usar la función->name_race
campo, entonces ->nombre sería como es normalmente. No hay una función “Obtener atributo sin procesar” en eloquent. código relevante: github.com/laravel/framework/blob/master/src/Illuminate/…– William Cahill-Manley
9 de julio de 2013 a las 9:01
Intenté esto pero traerá otros problemas con él. Supongo que necesito hackearlo en el administrador.
– L Holleman
9 de julio de 2013 a las 10:04