Los Accessors y los $appends son dos características muy poderosas que nos brinda Eloquent y si las combinamos, son mas poderosas aun. En este artículo vamos a ver: Como utilizar ambas características, cuando debemos usarlas y cual es su diferencia. Let’s rock! 🤘
¿Qué son los Accessors de Eloquent?
Los Accessors son métodos que podemos definir en nuestros modelos Eloquent y nos permite modificar los valores de los atributos de nuestro modelo.
Pero la características más potente de los Accessors es que nos brindan la posibilidad de definir atributos que no existen en la tabla de la base de datos. Vamos a ver porque esta característica es tan importante.
Primero, ¿cómo funcionan los Accessors?
Ahora que sabemos que es un accessors, veremos como funcionan: por ejemplo, si tienes el modelo User y dos campos llamados nombre y apellido en la tabla de base de datos, podemos crear un Accessor en el modelo User para obtener el nombre completo del usuario.
public function getNombreCompletoAttribute() { return $this->nombre . ' ' . $this->apellido; }
Ahora ya tenemos acceso a la propiedad nombre_completo sin la necesidad de crear una columna en la base de datos para este valor.
echo User::first()->nombre_completo;
Como vemos, debemos crear el Accessor en CamelCase, con la palabra «get» al principio, luego el nombre que tendrá la nueva propiedad y luego la palabra «Attribute». Eloquent se encarga de generar el atributo cada vez que accedemos a él. Nótese que para utilizar el nuevo atributo pongo el guion bajo cada vez que comienzo el nombre del atributo con una mayúscula en el método.
Pero hay un problema con todo esto. Si queremos responder con los valores del modelo, no tendremos disponible el atributo nombre_completo.
return User::first()->toJSON();
El resultado se vera de la siguiente forma:
{ "id": 1, "nombre": "Matias", "apellido": "Echazarreta", "email": "echazarreta@test.com", "created_at": "2019-02-19 11:32:08", "updated_at": "2019-02-19 20:11:10" }
¡Appends al rescate!
Cuando necesitamos responder los datos que nos brindan los Accessors, por ejemplo en una API, debemos utilizar los appends que nos tenemos disponible en el modelo Eloquent.
¿Cómo funcionan los appends? Muy fácil, solamente debemos crear la propiedad $appends a nuestro modelo (en este caso, en el modelo User) y agregar el nombre del campo que genera el accessor.
class User extends Model { // ... protected $appends = ['nombre_completo']; public function getNombreCompletoAttribute() { return $this->nombre . ' ' . $this->apellido; } // ... }
Eso es todo, ahora tendremos disponible el nuevo atributo en la respuesta anterior:
{ "id": 1, "nombre": "Matias", "apellido": "Echazarreta", "email": "echazarreta@test.com", "created_at": "2019-02-19 11:32:08", "updated_at": "2019-02-19 20:11:10", "nombre_completo": "Matias Echazarreta" }
Conclusión
En resumen, si definimos Accessors tendremos disponible el nuevo campo para imprimirlo o utilizarlo en nuestra aplicación. Pero si necesitamos tenerlo disponible en las respuestas de nuestras APIs, debemos agregarlo al arreglo $appends.
Si queres saber mas de los Accessors, podes visitar la documentación oficial.
Wow muchísimas gracias por esto!
Excelente, gracias por el tip!
Excelente tip muchas gracias!!
Accessors and mutators allow you to format Eloquent attribute values when you retrieve or set them on model instances. For example, you may want to use the Laravel encrypter to encrypt a value while it is stored in the database, and then automatically decrypt the attribute when you access it on an Eloquent model.
Excelente post, ya conocía los acessors pero combinado con un appeds es aún mejor
De no saber nada sobre Accessors y $appends a querer ponerlo ahora en todos mis modelos 😋
Me alegro bro! No abuses tampoco 😄
Gracias por la explicacion.
muchas gracias bro