📊 Capítulo 07: Relacionamentos & Preloading
Especialização Backend com Go & Gin Gonic
🗺️ O Carregamento Eficiente de Relacionamentos (Eager Loading)
flowchart TD
QUERY["db.Preload('Itens').Preload('Usuario').Find(&pedidos)"]
--> GORM_EXEC["GORM executa queries otimizadas em lote (Batch Loading)"]
--> Q1["1. SELECT * FROM pedidos WHERE ..."]
--> Q2["2. SELECT * FROM itens WHERE pedido_id IN (1, 2, 3...)"]
--> Q3["3. SELECT * FROM usuarios WHERE id IN (10, 11...)"]
--> MEMORY["Monta o grafo de structs completo na memória com altíssima velocidade!"]
style QUERY fill:#ede7f6,stroke:#512da8,stroke-width:2px
style GORM_EXEC fill:#fff3e0,stroke:#ff9800,stroke-width:1.5px
style Q1 fill:#e8f5e9,stroke:#4caf50,stroke-width:1.5px
style Q2 fill:#e8f5e9,stroke:#4caf50,stroke-width:1.5px
style Q3 fill:#e8f5e9,stroke:#4caf50,stroke-width:1.5px
style MEMORY fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
🎯 Slide 1: Tipos de Associações no GORM
-
Belongs To & Has One:
UsuarioID uint+Usuario Usuario. -
Has Many (1:N):
Itens []ItemPedido. - Many to Many (N:N):
Tags []Taggorm:”many2many:produto_tags;”``.
🎯 Slide 2: Preloading com Filtros e Condições
db.Preload("Itens", "quantidade > ?", 2).
Preload("Usuario").
Find(&pedidos)
- Elimina completamente o problema de N+1 queries sem precisar escrever JOINs manuais complexos.
🎯 Slide 3: Joins Explícitos para Agregações
db.Table("usuarios").
Select("usuarios.nome, count(pedidos.id) as total").
Joins("left join pedidos on pedidos.usuario_id = usuarios.id").
Group("usuarios.id").
Scan(&resultado)
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim