En esta lección vamos a aprender un poco más sobre cómo trabajar con los atributos de Eloquent, es decir cómo podemos leer y asignar atributos a un modelo. La asignación de atributos la haremos utilizando asignación masiva e individual, y veremos de qué se trata el error MassAssignmentException, cómo solucionarlo y cual es la protección que nos ofrece Laravel para evitar la inyección de atributos no deseados cuando cargamos datos provenientes de la petición de un usuario (por ejemplo a través de un formulario o API). Además te enseñaré cómo puedes convertir atributos de un tipo a otro mediante la propiedad $casts de Eloquent. Todos estos conceptos te acercarán más a lo que necesitas saber para comenzar a crear módulos CRUD con este genial framework.


Repositorio

Ver el código de esta lección en GitHub

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Notas

Leer y asignar atributos

Cuando trabajamos con Eloquent, todos los atributos de un modelo (o columnas de un registro) son tratados como si de propiedades públicas de la clase se tratasen. Por ejemplo si quieres obtener el nombre de un usuario almacenado en la variable $user, puedes escribir: $user->name; // obtiene el nombre del usuario.

Para re-asignar otro nombre puedes escribir $user->name = 'Duilio';

Estos cambios no serán guardados automáticamente en la tabla de usuarios en la base de datos, sino que necesitas ejecutar el método save para hacer esto:

$user->save(); //inserta o actualiza el usuario en la base de datos

Eloquent es lo suficientemente inteligente para saber si debe ejecutar un INSERT o un UPDATE dependiendo si el usuario existe o no, respectivamente.

La propiedad exists de Eloquent, nos permite averiguar si un modelo existe o no, ejemplo: $user->exists //devuelve TRUE si el usuario ya existe en la base de datos, FALSE de lo contrario.

Puedes aprender más sobre cómo trabajar y utilizar métodos y propiedades mágicas con PHP en nuestro Curso de Programación Orientada a Objetos con PHP.

Evitar fallos de seguridad por asignación masiva de datos

La excepción MassAssignmentException es una forma en la que el ORM nos protege. Una vulnerabilidad de asignación masiva ocurre cuando un usuario envía un parametro inesperado mediante una solicitud y dicho parametro realiza un cambio en la base de datos que no esperabas. Por ejemplo, un usuario podría, utilizando Chrome Developer Tools o herramientas similares, agregar un campo oculto llamado is_admin con el valor de 1 y enviar la solicitud de registro de esta manera. Si no tienes cuidado con esto entonces cualquier usuario podría convertirse en administrador de tu aplicación, con consecuencias nefastas para tu sistema.

Para evitar esto, dentro del modelo agregamos la propiedad $fillable y asignamos como valor un array con las columnas que queremos permitir que puedan ser cargadas de forma masiva:

class User extends Model
{
    protected $fillable = ['name', 'password', 'email'];
}

También tenemos disponible la propiedad $guarded. Al igual que $fillable, esta propiedad tendrá como valor un array, pero en este caso las columnas que indicamos son las que no queremos que puedan ser cargadas de forma masiva:

class User extends Model
{
    protected $guarded = ['is_admin'];
}

Asignar un campo no fillable

Para asignar un valor a un campo que no está dentro de $fillable, podemos asignar una nueva instancia de un modelo en una variable y luego asignar el campo de forma manual:

$user = new User(['name' => 'Duilio', 'password' => bcrypt('123')]);

$user->is_admin = true;

$user->save();

Nota que new User($datos) solo crea un nuevo modelo sin persistirlo en la base de datos VS User::create($datos) que crea un nuevo modelo y lo inserta en la base de datos en un solo paso.

Convertir atributos

La propiedad $casts nos permite convertir atributos a diferentes tipos de datos dentro de un modelo. $casts recibe como valor un array donde la llave es el nombre del atributo que será convertido y el valor el tipo al que lo queremos convertir:

protected $casts = [
    'is_admin' => 'boolean'
];

En este caso convertimos la propiedad is_admin a boolean.

Material relacionado

Únete a nuestra comunidad en Discord y comparte con los usuarios y autores de Styde, 100% gratis.

Únete hoy

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Usando Eloquent ORM de forma interactiva con Tinker Lección siguiente Manejo de relaciones con el ORM Eloquent