📊 Capítulo 07: Relacionamentos & Eager Loading
Especialização Backend com PHP & Laravel
🗺️ O Dilema N+1: Lazy Loading vs Eager Loading no Eloquent
flowchart TD
QUERY["$pedidos = Pedido::all() (100 pedidos)"]
--> LOOP{"Loop foreach ($pedidos as $p) { echo $p->cliente->nome; }"}
LOOP --> |"Lazy Loading Ingênuo"| N1["🚨 Problema N+1: 1 query para pedidos + 100 queries para clientes (101 SELECTs no banco!)"]
LOOP --> |"Eager Loading: Pedido::with('cliente')->get()"| OPT["⚡ Otimizado: EXATAMENTE 2 QUERIES no banco! (SELECT * FROM pedidos; SELECT * FROM clientes WHERE id IN (...))"]
style QUERY fill:#ede7f6,stroke:#512da8,stroke-width:2px
style LOOP fill:#fff3e0,stroke:#ff9800,stroke-width:1.5px
style N1 fill:#ffebee,stroke:#d32f2f,stroke-width:2px
style OPT fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
🎯 Slide 1: Tipos Canônicos de Relacionamento
-
hasOne/belongsTo: Um para um (1:1). hasMany/belongsTo: Um para muitos (1:N):public function itens(): HasMany { return $this->hasMany(ItemPedido::class); }
belongsToMany: Muitos para muitos (N:N) com tabela pivot.
🎯 Slide 2: Prevenção Automática de Lazy Loading
// No AppServiceProvider::boot()
Model::preventLazyLoading(! app()->isProduction());
- Dispara uma exceção em ambiente de desenvolvimento se você esquecer o
with(), garantindo que nenhum N+1 chegue em produção!
🎯 Slide 3: Eager Loading Aninhado e Contagens
-
$pedidos = Pedido::with(['cliente', 'itens.produto'])->get(); withCount('itens'): Adiciona o campoitens_countsem precisar carregar todas as instâncias filhas na memória.
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim