No pienses que eres el único que esta soltero y pasa los fines de semana programando mientras tus amigos están con sus novias/os. Los modelos de Eloquent también pueden estar solteros, sin una relación. Pero, a diferencia de ti y de mi, se les puede asignar una relación por defecto haciendo que, en ocasiones, nuestro programe no arroje un error.
Para esto, existe el método withDefault()
.
Código Eloquent para Relaciones por Defecto
Class User extends Authenticatable { public function profile() { return $this->hasOne(Profile::class)->withDefault([ 'avatar' => asset('img/avatar-default.jpg') ]); } }
Explicación del código
Para este ejemplo, supongamos que tenemos un modelo Profile encargado de manejar toda la información del perfil del usuario registrado y se necesita que, cuando el usuario no tenga cargada una imagen, se le asigne automáticamente una imagen por defecto (para este caso, avatar-default.jpg). Entonces, utilizamos el método withDefault() en la relación, enviándole un array con los datos que queremos setear por defecto. Asà de fácil!
En este caso, seteamos un solo atributo, el avatar. Pero podrÃa ser la cantidad de atributos que ustedes quieran, siempre y cuando sean atributos del modelo Profile.
¿Cómo funciona el método withDefault()?
La función withDefault devuelve valores por defecto cuando la relación devuelve null. Esté patrón se lo conoce como Patrón de Objeto Nulo y puede ayudar a eliminar las comprobaciones en tu código.
Cabe aclarar que withDefault funciona cuando la relación es nula pero no cuando existe relación pero los atributos son nulos.
¿Por qué utilizar la función withDefault()?
Ustedes dirán «puedo hacer esto mismo en mi plantilla blade, verificando si el usuario tiene avatar y si no tiene, muestro la imagen por defecto». Si, podrÃan hacerlo, pero se estarÃa complicando ustedes mismos por dos razones:
Primero, tendrÃan que agregar lógica a la vista y lo mejor es que, en lo posible, eviten agregar lógica en las vistas. Además, les quedarÃa un código feo y complicado:
// Sin withDefault() <img src="{{ isset($user->profile) && $user->profile->avatar ? $user->profile->avatar : asset('img/avatar-default.jpg') }}"> // Con withDefault() <img src="{{ isset($user->profile->avatar }}">
Segundo, si algún dÃa les piden modificar la ruta de la imagen por defecto, deberÃan modificar todas las plantillas donde tienen implementado el caso «Sin withDefault». En cambio, de la otra forma deberÃan modificar solo la función withDefault. Mucho mas fácil y rápido!
¿A partir de que versión de Laravel esta disponible?
Si estas al dÃa con las versiones de Laravel, seguramente la tengas disponible. Pero si no es asÃ, el método withDefault a partir de la versión 5.3.
Conclusión
Vimos que por varias cuestiones este método de Eloquent es genial, ya que nos ayuda a reducir código en nuestras vistas, reducir errores y mantener un control total de los valores por defecto de nuestras relaciones. Asà que, anÃmate a jugar un poco con withDefault seguramente notaras sus beneficios y hasta le podrÃas encontrar nuevas formas de utilizarlo.
Déjame tus comentarios de que te ha parecido este artÃculo y si tienes dudas o consultas, te ayudare a resolverlas.
No te olvide de compartir si te gusto. Nos vemos en próximos artÃculos. 😉🤙
Excelente información erróneamente estaba agregando mas lógica a la vista pero este post me viene perfecto ya que tengo el mismo problema que se muestra aquà con las imágenes, he revisado varios artÃculos y me parecen increÃbles sin duda se nota tu experiencia, gracias por compartir estoy valiosos tip.
Muchas gracias a vos Juan Carlos por tu comentario. Saludos.
Practicamente soy nuevo en laravel recien estoy empezando, y tu blog me parece absolutamente genial, esta todo bien detallado y la interfaz para navegar y estudiar las cosas que enseñas es simplemente hermosa, estare atento a las actualizaciones, Slds