0Pricing
PHP Academy · Aula

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 author

Carregamento 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

  1. Modelos Eloquent e migrações
  2. CRUD com Eloquent
  3. Relacionamentos do Eloquent
  4. Carregamento antecipado e escopos de consulta
← Voltar para PHP Academy