Carga anticipada y ámbitos de consulta
Evite las consultas N+1 mediante carga anticipada y reutilice la lógica con ámbitos de consulta.
Carga anticipada y ámbitos de consulta es una lección gratuita de PHP Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de PHP Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de PHP Academy incluye 4 lecciones en total.
El problema N+1
La carga diferida ejecuta una consulta por modelo al acceder a una relación dentro de un bucle; esto puede ser catastrófico a gran escala.
<?php
$posts = Post::all(); // 1 query
foreach ($posts as $post) {
echo $post->author->name; // 1 query per post = N+1 total!
}Carga anticipada con with()
Resuelva el problema N+1 mediante la carga anticipada de las relaciones desde el principio en una consulta adicional.
<?php
$posts = Post::with("author")->get(); // 2 queries total
foreach ($posts as $post) {
echo $post->author->name; // no extra query
}Carga anticipada de varias relaciones
Cargue varias relaciones a la vez.
<?php
$posts = Post::with(["author", "tags", "comments"])->get();Carga anticipada anidada
Cargue relaciones anidadas mediante la notación de puntos.
<?php
$posts = Post::with("comments.author")->get();
// Loads posts, their comments, and each comment's authorCarga anticipada con restricciones
Aplique condiciones a la relación cargada anticipadamente.
<?php
$posts = Post::with(["comments" => function ($q) {
$q->where("approved", true)->latest();
}])->get();withCount()
Cargue el número de elementos de un modelo relacionado sin cargar los modelos relacionados.
<?php
$posts = Post::withCount("comments")->get();
foreach ($posts as $post) {
echo $post->comments_count;
}Carga anticipada diferida (load())
Cargue anticipadamente las relaciones en una colección ya recuperada mediante load().
<?php
$posts = Post::all();
// Later, when you know you need the authors:
$posts->load("author");Alcances de consulta globales
Los alcances globales añaden automáticamente restricciones a todas las consultas de un modelo.
<?php
class PublishedScope implements \Illuminate\Database\Eloquent\Scope {
public function apply(Builder $builder, Model $model): void {
$builder->where("is_published", true);
}
}Alcances de consulta locales
Los alcances locales son restricciones de consulta reutilizables definidas en el modelo como métodos cuyo nombre empieza por scope.
<?php
class Post extends Model {
public function scopePublished(Builder $query): void {
$query->where("is_published", true);
}
public function scopeByUser(Builder $query, int $userId): void {
$query->where("user_id", $userId);
}
}
// Usage:
Post::published()->byUser(1)->latest()->get();Combinar alcances
Encadene varios alcances locales para obtener una lógica de consulta legible y reutilizable.
<?php
$posts = Post::published()
->byUser(auth()->id())
->orderBy("created_at", "desc")
->paginate(15);Detección de N+1 durante el desarrollo
Use Laravel Debugbar o ejecute DB::enableQueryLog() para detectar cantidades inesperadas de consultas durante el desarrollo.
Resumen
Use with() para cargar anticipadamente las relaciones y eliminar las consultas N+1. Use withCount() para obtener recuentos. Defina alcances locales para crear restricciones de consulta reutilizables y legibles.
Comprobación rápida
¿Qué método carga anticipadamente los modelos relacionados para resolver el problema N+1?
Preguntas frecuentes
¿La lección «Carga anticipada y ámbitos de consulta» es gratis?
Sí — el texto completo de «Carga anticipada y ámbitos de consulta» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de PHP Academy, actualiza a CoddyKit PRO. El curso de PHP Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Carga anticipada y ámbitos de consulta»?
Evite las consultas N+1 mediante carga anticipada y reutilice la lógica con ámbitos de consulta. Practicas PHP Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar PHP Academy?
No se requiere experiencia previa. PHP Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Carga anticipada y ámbitos de consulta»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de PHP Academy?
Sí. Cada lección de PHP Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Modelos y migraciones de Eloquent
- CRUD con Eloquent
- Relaciones de Eloquent
- Carga anticipada y ámbitos de consulta