🧩 Exercícios: Associações no GORM e Preloading
Spec Backend Com Golang E Gin • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 07.1 — Relacionamento Has Many com Chave Estrangeira
Contexto: Relacionamento Has Many com Chave Estrangeira no contexto de Associações no GORM e Preloading.
Requisitos de Execução:
- Modelar structs
ClienteePedidoonde Cliente possui lista de pedidos (Pedidos []Pedido).
Resultado Esperado
Associação 1:N modelada no GORM com chave estrangeira.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_1_SeuNome - Envie na tarefa:
Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// models/relacionamentos.go
package models
import "gorm.io/gorm"
type ClienteComPedidos struct {
gorm.Model
Nome string
Pedidos []Pedido `gorm:"foreignKey:ClienteID"`
}
type Pedido struct {
gorm.Model
ClienteID uint
Valor float64
}
🔍 Nível 2: Prática
Problema 07.2 — Carregamento Antecipado com db.Preload(‘Pedidos’)
Contexto: Carregamento Antecipado com db.Preload(‘Pedidos’) no contexto de Associações no GORM e Preloading.
Requisitos de Execução:
- Buscar cliente e carregar todos os seus pedidos em uma única operação com
db.Preload('Pedidos').Find(&clientes).
Resultado Esperado
Clientes e respectivos pedidos carregados sem gerar queries N+1.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_2_SeuNome - Envie na tarefa:
Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// preload_query.go
package main
import (
"gorm.io/gorm"
"espec_backend_go_gin/models"
)
func BuscarClientesComPedidos(db *gorm.DB) ([]models.ClienteComPedidos, error) {
var lista []models.ClienteComPedidos
err := db.Preload("Pedidos").Find(&lista).Error
return lista, err
}
⚡ Nível 3: Integração
Problema 07.3 — Relacionamento Many-to-Many com Tabela de Associação (joinTable)
Contexto: Relacionamento Many-to-Many com Tabela de Associação (joinTable) no contexto de Associações no GORM e Preloading.
Requisitos de Execução:
- Modelar relação N:M entre
UsuarioeRegracom taggorm:'many2many:usuario_regras;'.
Resultado Esperado
Tabela de ligação criada e gerenciada automaticamente pelo GORM.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_3_SeuNome - Envie na tarefa:
Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// many_to_many.go
package main
import "gorm.io/gorm"
type Regra struct {
gorm.Model
Nome string
}
type UsuarioComRegras struct {
gorm.Model
Nome string
Regras []Regra `gorm:"many2many:usuario_regras;"`
}
🏆 Nível 4: Desafio Corporativo
Problema 07.4 — Preload Condicional com Filtros Aninhados
Contexto: Preload Condicional com Filtros Aninhados no contexto de Associações no GORM e Preloading.
Requisitos de Execução:
- Carregar apenas pedidos com status ‘PAGO’ usando
Preload('Pedidos', 'status = ?', 'PAGO').
Resultado Esperado
Preload filtrado executado: Apenas pedidos pagos associados ao cliente.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_07_4_SeuNome - Envie na tarefa:
Atividade Cap 07 - Associações no GORM e Preloading
🔑 Gabarito de Código & Solução Comentada
// filtered_preload.go
package main
import "gorm.io/gorm"
func BuscarPedidosPagos(db *gorm.DB, clienteID uint) error {
var cliente models.ClienteComPedidos
return db.Preload("Pedidos", "valor > ?", 100.0).First(&cliente, clienteID).Error
}