Saltar accesorio de modelo

4 minutos de lectura

avatar de usuario
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?

  • ¿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

avatar de usuario
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 tienes name=something y lo cambiaras y llamaras getOriginal('name') todavía obtendrás el something 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

avatar de usuario
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;

¿Ha sido útil esta solución?