En mi experiencia con Laravel he visto muchas formas de utilizar Eloquent. Algunas de ellas son muy buenas y otras no tanto. Ya que, producen consultas de mas, obtienen mas datos de los necesarios o, pero aun, traen mas resultados de los necesarios.
Por eso, voy a dar 3 consejos muy importantes que te ayudarán a utilizar Laravel Eloquent eficientemente.
Primer consejo: Usa el método SELECT()
No se porque pero cuando escribimos consultas SQL en plano tendemos a escribir cada una de las columnas que deseamos obtener, pero con Eloquent no es asÃ. Directamente escribimos el modelo, los where y el get, no? Bueno, esto es algo que yo siempre hacia cuando comencé con Laravel y Eloquent. Pero, después me di cuenta que esto era ineficiente (gracias a debugbar). Veamos este caso:
* Si no entiendes porque escribà el método where de esa forma, date una vuelta por el artÃculo, Gemas Ocultas del método Where.
Esta consulta de Eloquent esta bien, trae todos los usuarios con sexo masculino. Peeero, no es eficiente. Y, ¿por qué no es eficiente? porque no estamos especificando las columnas a traer en los resultados. Y estar atentos a estos detalles son los que te convierten de un buen programador a un excelente programador.
La forma correcta de hacerlo es utilizar el método SELECT() especificando las columnas que vayamos a utilizar. Por ejemplo:
Tip: Puedes no utilizar el método select() y poner las columnas en el método get().
Y no quiero ver en los comentarios mensajes como: «Aiii pero tardo mas en escribir las consultas!». Recuerda esto:
En la programación no importa lo rápido que seas escribiendo código, sino lo rápido que funcione. Clic para tuitearSegundo consejo: No obtengas todos los resultados si vas a necesitar solo uno.
Esto puede parecer algo obvio, pero vi muchas veces que se utiliza el método get por inercia o el método first de una forma incorrecta.
Veamos el primer caso: el método get. Muchas veces sabemos que nuestra consulta va a arrojar un solo resultado ya sea, porque estamos buscando por ID, por ejemplo. Pero seguimos utilizando la función get que no establece un LIMIT en la consulta haciendo que la misma sea ineficiente.
Entonces, siempre que sepas que vas a hacer una consulta que va a devolver un único resultado, utiliza el método FIRST(), en vez de GET().
Ahora, vamos al caso de la mala utilización del método first.
Esto siempre lo hacia en mis comienzos con Laravel y Eloquent hasta que un compañero del trabajo me ilumino 😛. ¿Ustedes sabÃan que hay una gran diferencia entre hacer esto $user->posts->first()
 que hacer esto $user->posts()->first()
? Yo no lo sabia, para mi era lo mismo. Pero no, la diferencia es que, en el primer caso Laravel obtendrá todas las publicaciones y luego aplicará el método first. Este método first no es el mismo de Eloquent, sino que pertenece a la clase Collection. Traducido a otra forma, esto podrÃa ser equivalente a esto:
Como pueden ver, se ejecuta la consulta sin un limit y luego se toma el primer resultado de la colección.
La forma correcta de hacer esto es con el segundo caso que puse:Â $user->posts()->first()
. De esta forma Eloquent se encargara de obtener el primer resultado y devolverlo. Se traduce a esto:
Si a alguien le entro la duda de porque es mejor utilizar una forma que la otra, es porque siempre es mejor dejar el tratamiento de datos a la base de datos que a php.
Tercer consejo: Ojo con el método pluck!
Mucha gente es fanática de esté método y esta muy bien porque es una muy buena función, el problema es que aveces no se utiliza de la forma correcta. Vamos a ver porque.
El método pluck nos permite seleccionar las columnas que deseamos pero muchas veces hacemos $user->posts->pluck('name', 'id')
y aquà esta pasando algo parecido que en el caso anterior. Primero estamos obteniendo todas las columnas con Eloquent y luego las filtramos con un método perteneciente a Collection.
Asà que como ya se habrán dado cuenta, la forma correcta de hacerlo es $user->posts()->pluck('name', 'id')
. Esto hace que Eloquent sea el encargado de seleccionar las columnas deseadas, o sea, en el fondo esta haciendo SELECT name, id
 en vez de SELECT *
.
Conclusión
Bueno, hasta acá el artÃculo. Básicamente tenemos que tener cuidado en como armamos nuestras consultas cuando usamos Eloquent, seleccionar las columnas deseadas y establecer un limite de respuestas. Con estos simples consejos, tu aplicación va a funcionar mucho mejor. Hasta la próxima! 😉🤙
Me gusto la frase «En la programación no importa lo rápido que seas escribiendo código, sino lo rápido que funcione», pero eso deja fuera a todo framework disponible, que lo único que hacen es ayudar a ordenar y escribir código más rápido, si se quiere optimizar el código al máximo para tener una ejecución más rápida siempre se deberÃan usar los lenguajes sin capas de abstracción superiores.
No creo que los frameworks sirvan únicamente para escribir menos código. Justamente, donde ponga la frase que mencionas, hay que escribir más código para aprovechar mejor al framework. Gracias por tu comentario Paulo.
Que buenos Tips , soy nuevo en Laravel llevo casi 2 meses, igual me habÃa percatado del Tercer Concejo, solo sabia que uno me entregaba mas datos haciendo dd(). Pero ahora la tengo mas clara. Se agradece tus experiencias de trabajo, seguà adelante. Saludos
Muchas gracias Eddy!
dd(‘Gracias por el aporte’)
Llevo algún tiempo con Laravel pero apenas descubro tu página, ¡que siga asÃ!
Muchas gracias Eduardo! (te voy a robar el «dd()» para comentar 😄). Saludos!
Muchas gracias por estas buenas practicas y sobre todo la manera mas eficiente de utilizarlo, soy nuevo y estos consejos me sirven mucho para hacer mas entendible mi aprendizaje. Gracias y seguiré leyendo este buen sitio.
Gracias a vos Ramón por tu comentario. Veré si me puedo hacer tiempo para volver con más publicaciones.
Saludos.