¿Usas Eloquent? pero ¿Aprovechas Todo su Potencial? Olvidate de los Joins

De manera simple eloquent cambia nuestra percepción de lo que es una base de datos. Con eloquent cada modelo de nuestro proyecto representa una tabla de la base de datos. Comprendiendo esto ya no vamos a hablar de relaciones de tablas sino de modelos y clases en php, por lo tanto si nuestros modelos estan relacionados ya no debemos hacer uso de sentencias join que a muchos nos generan dolor de cabeza.

Eloquent no reemplaza en su totalidad al SQL, es más para poder usar eloquent debemos de tener buenas bases de SQL o MYSQL, pero dejaremos que eloquent haga el trabajo por nosotros.


Implementar el modelo relacional de una base de datos en laravel para que eloquent lo interprete adecuadamente, puede ser un poco enredado pues debemos de seguir varias reglas, pero el esfuerzo vale la pena. En este post vamos a comprender un poco de las grandes ventajas que ofrece eloquent, principalmente al reducir la cantidad de código SQL que debemos pensar y codificar con nuestras propias manos en el proyecto 

Relaciones Uno a Muchos

En los siguientes Modelos ilustramos las siguientes relaciones:

Empresas   –1————-*–>Sucursales (Una empresa tiene muchas sucursales)

Users          –*————-1–>Empresas (Una empresa tiene muchos usuarios)

Users          –*————-1–>Sucursales (Una sucursal tiene muchos usuarios)


 



 

 

[quads id=1]

Aparece acá la magia de eloquent, comenzaremos a realizar consultas y gradualmente aumentaremos el nivel de  dificultad:


Consultemos Todos los Usuarios

Consultemos Un Usuario Especifico con Id 1

Consultemos Un Usuario de con otras Caracteristicas

Ahora si la Magia, como accedemos a la sucursal del usuario

Suponiendo que consultamos un usuario especifico

En la vista podemos acceder a esos datos gracias a la relación creada previamente

Y ¿Como podríamos conocer el nombre de la empresa a la que pertenece el usuario?

O incluso de esta manera

En todos los ejemplos anteriores estamos realizando la consulta en la tabla usuarios, si mostráramos los datos retornados de la consulta serian los de la tabla users. Ahora ¿como podemos acceder a todos los datos? es decir, queremos obtener los datos de las tres tablas “empresas”, “sucursales” y “usuarios” para mostrárselos al user o para hacerles algún tratamiento antes de mostrárselos al usuario, en ese caso debemos hacer lo siguiente

En el ejemplo anterior, estamos accediendo a los datos de las tres tablas debido a que utilizamos el método with(), con el cual podemos obtener las relaciones “sucursale” y “empresa” que están en el modelo users, incluso podemos obtener una relación “empresa” del modelo sucursale, tal como esta el ejemplo obtenemos la relación “sucursale.empresa”, por esto podemos acceder al nombre de la empresa de la siguiente manera

Gracias a esto podríamos decirle adiós a los Join, claro esta!! no todas las consultas son posibles de esta manera, no porque eloquent tenga un error, ya que hay casos muy específicos en los que nosotros queremos hacer consultas por decirlo así raras, que probablemente eloquent no tenga un método directo para hacerlo.  Como tal vez hemos escuchado cada lenguaje o herramienta es tan buena como el que la posee o usa, así que hagamos de eloquent una Excelente Herramienta de Trabajo

Si estas empezando con Eloquent te recomiendo esta entrada para conocer las reglas del uso de Eloquent

¿Eloquent no realiza tus Consultas? O ¿Te Genera Errores? Conoce las Reglas para el uso de Eloquent

 

5 Replies to “¿Usas Eloquent? pero ¿Aprovechas Todo su Potencial? Olvidate de los Joins”

  1. Hola, me queda una duda en tu ejemplo. La relación entre empresa y users 1 a muchos (una empresa tiene muchos usuarios). Lo mismo pasa con la relación entre empresa y sucursale. Segun entiendo, sin ser experto ya que estoy recien partiendo, la relación en empresa deberia ser hasMany en vez de hasOne, ¿o estoy equivocado? Gracias.

  2. y como retorno todas las empresas con los usuarios que esta contiene, por ejemplo:

    empresa1: [
    “nombre”: ‘test’,
    “usuarios”: (Todos los usuarios que tenga)
    ],
    empresa2: [
    “nombre”: ‘test2’,
    “usuarios”: (Todos los usuarios que tenga)
    ],
    empresa3: [
    “nombre”: ‘test3’,
    “usuarios”: (Todos los usuarios que tenga)
    ]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *