Sabemos que Eloquent tiene grandes funcionalidades que simplifican y mejoran nuestros desarrollos pero muchas veces se nos pasa por alto alguna de ellas, ya que no están documentadas o simplemente nos olvidamos de ellas.
Así que, en este artículo vamos a ver 4 métodos de Eloquent no tan conocidos pero si muy útiles. Fuck yeah 🤘!
Aclaración: Las funciones que voy a describir se utilizan cuando ya obtuvimos los datos de la base de datos.
1 – Interceptando modelos Eloquent con Intersect()
El método intersect() nos permite obtener modelos de Eloquent que ya se encuentren en una colección de modelos.
Ejemplo de intersect()
Supongamos que tenemos dos colecciones de usuarios, una llamada $usersA
y otra $usersB
. En $usersA
tenemos una colección de usuarios obtenidos por cierta condición y queremos saber si los usuarios de $usersB
existen en $usersA
, entonces haríamos:
En este ejemplo, $results
contendrá todos los usuarios de B que cumplan con la condición que fue dada para obtener los usuarios del grupo A.
Disponibilidad de intersect()
El método intersect()
esta disponible desde Laravel 4.2.
2 – Cargando relaciones «on the fly» a modelos Eloquent con load()
Tenemos disponible el método load() que tal vez ya sea conocido por varios, pero para los que no conocen esta función, nos permite cargar relaciones a nuestro modelo. Muchas veces, esta es la mejor forma de optimizar las consultas a la base de datos.
Ejemplo de load()
Supongamos que teníamos una colección de usuarios y en cierto momento queremos obtener los productos de dichos usuarios:
Tal vez pienses que no hay diferencias si utilizaríamos solamente $user->products
, pero esto no es así. Veamos el siguiente ejemplo:
El primer bloque de código no es optimo ya que estamos generando una query en cada interacción del segundo foreach. En cambio, en el segundo bloque estamos cargando los productos de cada usuario previamente haciendo que, en cada interacción del segundo foreach, no se genera una consulta a la base de datos porque los productos ya están cargados en la colección.
Lo mejor de la función load() es que podemos obtener las relaciones de las relaciones, ¿cómo es esto?. Por ejemplo, si usuarios se relaciona con productos y a su vez, productos se relaciona con comentarios, podemos hacer lo siguiente:
$users->load('products.comments');
De esta forma obtendremos los productos del usuario y los comentarios de cada producto 👏.
Disponibilidad de load()
El método load()
esta disponible desde Laravel 4.2.
3 – Obtener claves del modelo muy fácilmente con modelKeys()
El método modelKeys() ya lo describí en el grupo de Hablemos de Laravel pero se merece un repaso para las personas que no son parte del grupo (no se que estas esperando para ir a facebook y unirte https://www.facebook.com/groups/HablemosDeLaravel/).
La función modelKeys()
es muy útil ya que nos permite obtener las primary keys de los registros que tengamos en una colección y remarco «primary keys» porque recordemos que no siempre el ID es la clave principal y esta función nos permite obtenerlas igualmente.
Ejemplo de modelKeys()
El ejemplo es muy sencillo ya que modelKeys() es muy intuitiva y fácil de utilizar. Aprovecho para aclarar que este método se debe utilizar cuando ya obtuvimos los registros desde la base de datos.
Disponibilidad de modelKeys()
El método modelKeys()
esta disponible desde Laravel 4.2.
4 – Descartar modelos repetidos de Eloquent con unique()
Tenemos disponible el método unique() donde podemos pasarle una clave y la función nos devolverá una nueva colección sin repeticiones. Si no le pasamos una clave, tomará la clave principal de tu modelo.
Ejemplo de unique()
Disponibilidad de unique()
El método unique()
esta disponible desde Laravel 4.2.
Conclusión
Como pudimos ver, todos los métodos que describí existen desde hace tiempo pero a veces se nos olvidan que existen o no teníamos ni idea de su existencia. Por eso decidí escribir un artículo sobre algunos de los métodos de Eloquent más útiles. Existen muchos más que lo podes ver en su documentación oficial.
Coméntanos que método utilizas que te resulta útil y si te gusto este artículo, recuerda compartirlo en tus redes sociales. Nos vemos en el próximo Laravel tip 😉🤙.
Solo «unique» conocía, para validar formularios al crear un usuario para no repetir un campo por ningún otro usuario, como dato adicional, unique soporta recibir como primer parámetro la columna a evaluar y como segundo parámetro el valor de una excepción a la regla única, estoy casi seguro de que así funciona, si no solo se le pasa como parámetro la excepción …
Hola Ariel, muchas gracias por tu comentario. El nombre es igual al método de validación pero son distintas. Esta funciona solo para las colecciones y como primer parámetro recibe la «key» y un segundo parámetro booleano que es para hacer la búsqueda estricta. Saludos.
Hola, la función load() sería lo mísmo que hacer un with() cargando esa relación y llamándola luego? Por ejemplo con vuestro ejemplo sería algo asi cómo $users->whit(‘products)->products. Tengo entendido que de esta manera tampoco haces una query por cada usuario, ya que tienes la relación cargada con anterioridad. Un saludo!
Hola Alberto. Exacto una es anterior a obtener los resultados (with) y la otra es para cuando ya tenés la colección (load). Gracias por tu comentario.
A ti por la respuesta.
En el ejemplo de load, se prodria optimizar así? verdad.
$users->load(‘products?)
@foreach($users->products as $product)
{{ $product->price }}
@endforeach
Si, así se utiliza load. Pero siempre averigua si users tiene products antes de hacer un foreach ;). Saludos Ludwing.
Excelente información, es la primera ves que visito este sitio y me parece muy interesante, con muchas cosas útiles, estaré un buen tiempo por acá revisando los artículos, muchas gracias por compartir, saludos Matias desde Toluca, Edo de México.
Muchas gracias! 😀