IronWoods.es

Desarrollo web

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:

  1. 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.
  2. 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');