Carregamento antecipado e escopos de consulta
Evite consultas N+1 com carregamento antecipado e reutilize a lógica com escopos de consulta.
Carregamento antecipado e escopos de consulta é uma aula grátis de PHP Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de PHP Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de PHP Academy inclui 4 aulas no total.
O Problema N+1
O carregamento tardio executa uma consulta por Model ao acessar um relacionamento dentro de um loop — algo catastrófico em grande escala.
<?php
$posts = Post::all(); // 1 query
foreach ($posts as $post) {
echo $post->author->name; // 1 query per post = N+1 total!
}Carregamento Antecipado com with()
Resolva o problema N+1 carregando os relacionamentos antecipadamente em uma consulta adicional.
<?php
$posts = Post::with("author")->get(); // 2 queries total
foreach ($posts as $post) {
echo $post->author->name; // no extra query
}Carregando Vários Relacionamentos Antecipadamente
Carregue vários relacionamentos de uma só vez.
<?php
$posts = Post::with(["author", "tags", "comments"])->get();Carregamento Antecipado Aninhado
Carregue relacionamentos aninhados usando a notação com pontos.
<?php
$posts = Post::with("comments.author")->get();
// Loads posts, their comments, and each comment's authorCarregamento Antecipado com Restrições
Aplique condições ao relacionamento carregado antecipadamente.
<?php
$posts = Post::with(["comments" => function ($q) {
$q->where("approved", true)->latest();
}])->get();withCount()
Carregue a quantidade de um Model relacionado sem carregar os próprios Models relacionados.
<?php
$posts = Post::withCount("comments")->get();
foreach ($posts as $post) {
echo $post->comments_count;
}Carregamento Antecipado Tardio (load())
Carregue relacionamentos antecipadamente em uma coleção já recuperada com load().
<?php
$posts = Post::all();
// Later, when you know you need the authors:
$posts->load("author");Escopos Globais de Consulta
Os escopos globais adicionam automaticamente restrições a todas as consultas de um Model.
<?php
class PublishedScope implements \Illuminate\Database\Eloquent\Scope {
public function apply(Builder $builder, Model $model): void {
$builder->where("is_published", true);
}
}Escopos Locais de Consulta
Os escopos locais são restrições de consulta reutilizáveis, definidas no Model como métodos cujo nome começa com 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();Combinando Escopos
Encadeie vários escopos locais para obter uma lógica de consulta legível e reutilizável.
<?php
$posts = Post::published()
->byUser(auth()->id())
->orderBy("created_at", "desc")
->paginate(15);Detectando N+1 no Desenvolvimento
Use o Laravel Debugbar ou execute DB::enableQueryLog() para detectar quantidades inesperadas de consultas durante o desenvolvimento.
Resumo
Use with() para carregar relacionamentos antecipadamente e eliminar consultas N+1. Use withCount() para obter quantidades. Defina escopos locais para criar restrições de consulta reutilizáveis e legíveis.
Verificação Rápida
Qual método carrega Models relacionados antecipadamente para resolver o problema N+1?
Perguntas Frequentes
A aula “Carregamento antecipado e escopos de consulta” é grátis?
Sim — o texto completo de “Carregamento antecipado e escopos de consulta” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de PHP Academy, atualize para CoddyKit PRO. O curso de PHP Academy inclui 4 aulas no total.
O que vou aprender em “Carregamento antecipado e escopos de consulta”?
Evite consultas N+1 com carregamento antecipado e reutilize a lógica com escopos de consulta. Você pratica PHP Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar PHP Academy?
Nenhuma experiência prévia é necessária. PHP Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Carregamento antecipado e escopos de consulta”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de PHP Academy?
Sim. Cada aula de PHP Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Modelos Eloquent e migrações
- CRUD com Eloquent
- Relacionamentos do Eloquent
- Carregamento antecipado e escopos de consulta