Saltar al contenido

En Eloquent, el ORM de Laravel, solemos recurrir a métodos como with() para cargar relaciones y a whereHas() para filtrar registros en base a las relaciones. Sin embargo, a partir de Laravel 9.17, se presentó el método withWhereHas, que fusiona ambas acciones: carga la relación y, al mismo tiempo, aplica filtros a dicha relación.

De este modo, en lugar de escribir algo como:

Se puede simplificar a:

Con este método, obtendrás directamente todos los usuarios que tengan publicaciones marcadas como featured = true, y, a su vez, Eloquent hará la carga de esos posts.


Seleccionar columnas específicas con Eager Loading

Muchas veces no necesitamos todas las columnas de la tabla relacionada. Podemos optimizar la carga de datos especificando las columnas deseadas. Por ejemplo:

En este caso:

  • Se cargan únicamente las columnas id, title y category_id de la tabla de posts.

  • Eloquent ignora las demás columnas, lo cual ayuda a optimizar las consultas.


Comparativa: with() + whereHas() vs withWhereHas()

Método

Ventajas

Desventajas

with() + whereHas()

- Claridad al separar la lógica de filtrado (whereHas) de la carga (with).
- Disponible desde versiones anteriores de Laravel.

- Dos llamadas separadas que podrían alargarse en casos complejos.

withWhereHas()

- Combina la filtración y la carga en un solo método.
- Código más limpio y legible.

- Solo disponible a partir de Laravel 9.17.

withWhereHas aporta simplicidad y un código más fluido, pero en versiones anteriores a Laravel 9.17, la alternativa es combinar whereHas() y with() por separado.


Conclusión

El método withWhereHas facilita filtrar y cargar relaciones en una sola línea de código, haciéndolo ideal para mejorar la legibilidad y reducir la complejidad en consultas de Eloquent. Además, recuerda que puedes optimizar tu carga especificando solo las columnas necesarias mediante la notación de selección, asegurando que tu aplicación cargue datos de la forma más eficiente posible.

Si tu proyecto está en Laravel 9.17 (o superior) y quieres un código más limpio y conciso, withWhereHas es la mejor opción para filtrar y cargar relaciones simultáneamente.

¡Explora este método en tus proyectos y verás la diferencia en tu flujo de trabajo con Eloquent!

¡Comparte esta entrada con tus colegas y no olvides explorar la Ruta de Aprendizaje Laravel 11!

school Curso completo

Curso Laravel 12
Completo 2026

El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje