Curso de Laravel Gohu
El problema N+1 en Laravel: por qué tu reporte tarda tanto en cargar
Por Víctor Peña · Publicado el
Si alguna vez entraste a un reporte de tu sistema y te quedaste viendo el spinner girar por segundos —o minutos—, lo más probable es que tu código esté sufriendo del clásico problema N+1.
Esta es la última lección del curso, y es la más práctica de todas: ya sabes escribir consultas, ahora toca aprender a no escribirlas de más sin darte cuenta.
El síntoma
Imagina que tu reporte hace algo tan simple como esto:
use App\Models\Mascota;
$mascotas = Mascota::all();
foreach ($mascotas as $mascota) {
echo $mascota->refugio->nombre;
}
Se ve inofensivo, ¿no? Pero por debajo está pasando esto:
- 1 consulta para traer todas las mascotas.
- +1 consulta por cada mascota, para traer su refugio.
Si tienes 60 mascotas, eso son 61 consultas a la base de datos en una sola carga de página.
De ahí viene el nombre: N + 1, donde N es la cantidad de registros de la consulta principal.
Por qué no lo notaste antes
En desarrollo, con 5 o 10 registros de prueba, esto es casi instantáneo. El problema es que crece junto con tus datos.
Con 1.000 registros en producción ya no son 61 consultas: son 1.001. Y ahí es donde tu reporte, que antes tardaba medio segundo, empieza a tardar 10, 20 o más.
Por eso el N+1 casi siempre se descubre tarde, cuando el sistema ya está en manos del cliente y la tabla creció.
La solución: eager loading
La solución es una sola palabra: with().
use App\Models\Mascota;
$mascotas = Mascota::with('refugio')->get();
foreach ($mascotas as $mascota) {
echo $mascota->refugio->nombre;
}
Con esto, Eloquent carga la relación de forma anticipada —lo que se llama carga ansiosa o eager loading— y en vez de 61 consultas ejecuta 2: una para las mascotas y otra para todos los refugios relacionados, de una sola vez.
| Consultas | Tiempo aprox. | |
|---|---|---|
| Antes (N+1) | 61 | ~41 ms |
Después (with) |
2 | ~4 ms |
Diez veces más rápido cambiando una línea. Y la diferencia se agranda cuanto más crecen tus datos.
Dónde más aparece el N+1
El caso del foreach es el más evidente, pero no es el único. Estos tres también son N+1 disfrazado:
Contar dentro del bucle. Si por cada refugio haces $refugio->mascotas->count(), estás trayendo todas las mascotas de cada refugio solo para contarlas. Se resuelve con withCount():
use App\Models\Refugio;
Refugio::withCount('mascotas')->get();
Relaciones anidadas. Si recorres refugios, luego sus mascotas y luego las vacunas de cada mascota, el problema se multiplica en cada nivel. La carga anidada lo resuelve de una vez:
use App\Models\Refugio;
Refugio::with('mascotas.vacunas')->get();
En la vista, no en el controlador. A veces la consulta del controlador está bien optimizada, pero la plantilla accede a una relación que nadie cargó. El síntoma es el mismo y la causa está en otro archivo.
Cómo detectarlo antes de que llegue a producción
Lo peligroso del N+1 es que es invisible a simple vista. No sale en un error, no rompe nada: solo hace todo más lento, en silencio.
Por eso ayuda tener una herramienta que te muestre las consultas reales que dispara cada línea de tu código mientras programas, en vez de descubrirlo cuando el cliente se queja.
Es justamente para lo que sirve Laravel Gohu: escribes la consulta, pulsas ▶ Run y ves de inmediato el resultado en JSON junto con el tiempo de ejecución y el conteo real de registros. Comparar la versión con with() y la versión sin él deja de ser una teoría y pasa a ser un número en pantalla.
En resumen
Si un reporte va lento, antes de sospechar del servidor o de la base de datos, revisa si estás recorriendo una colección y accediendo a relaciones dentro del bucle. Esa es, en el 90 % de los casos, la causa real.
Y la regla práctica que vale para todo el curso: si sabes de antemano que vas a usar una relación, cárgala con with() desde el principio.
Con esto cerramos el curso de Laravel Gohu. Ya sabes consultar con Eloquent, con el Query Builder y con SQL directo, crear, editar y eliminar registros, y ahora también detectar el error de rendimiento más común de todos.
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp