Blog / Laravel / Accessors y Mutators
Los accessors y mutators en Laravel
son métodos especiales que definimos en un modelo,
para modificar de forma automática un dato que nos van a devolver
las consultas (accessor) o un dato
que llega para ser guardado (mutator).
Accessors
Un accessor tiene la forma:
getXxxAttribute()
Donde Xxx corresponde al nombre del campo de la tabla
donde está el dato que se va a obtener.
Mutators
Un accessor tiene la forma:
setXxxAttribute()
Donde Xxx corresponde al nombre del campo de la tabla
donde se guardará el dato.
Ejemplos
Tengo una tabla "posts", con varios campos.
Uno se llama "author" y guardará un string.
Otro es el campo "published_at" que almacena una fecha.
Todo normal, ahora es cuando consideraremos unos requerimientos
de la aplicación:
- El autor debe empezar por letra mayúscula.
Convertiremos a mayúscula el string que nos llegue para este
campo antes de guardarlo usando un mutator.
- Las fechas en la base de datos se guardan en este formato:
"2020-08-30 19:38:48", un poco americano...
Necesitamos mostrar las fechas en formato español,
"30-08-2020 19:38:48", usando un accessor.
Es decir, que modificamos el string que llega al modelo "Post"
para el campo "author" antes de guardarlo.
Modificamos también en el mismo modelo, el formato de fecha de salida
para cada consulta, con respecto al almacenado en "published_at"
en la base de datos.
// accessor
public function getPublishedAtAttribute($value)
{
return \Carbon\Carbon::parse($value, 'Europe/Madrid')
->locale('ES')
->isoFormat('DD-MM-YYYY, HH:mm:ss');
}
// mutator
public function setAuthorAttribute($value)
{
$this->attributes['author'] = ucfirst($value);
}
Recuperar el valor original de un atributo
El ejemplo de accesor anterior es de uso frecuente:
modifica la fecha para devolverla en un formato válido en España.
Como usamos las fechas para diferentes cálculos,
necesitamos poder obtener la fecha original.
¿Cómo saltarnos el accesor y obtener el valor original?
// Laravel 5.x y 6
$model->getOriginal('created_at');
// Desde Laravel 7.x
$model->getRawOriginal('created_at');