Associações
Modele relacionamentos
Associações é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 3 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 Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
Modelando relacionamentos
As associações do GORM mapeiam relacionamentos entre tabelas para campos de estruturas. Os quatro tipos são um para um, um para muitos, muitos para um e muitos para muitos.
- Expresse chaves estrangeiras como campos de estruturas
- Carregue dados relacionados automaticamente
- Crie registros relacionados juntos
Um para muitos
Um usuário tem muitas publicações. O registro pai contém uma fatia de registros filhos, e o filho contém uma chave estrangeira de volta para o pai.
type User struct {
gorm.Model
Name string
Posts []Post
}
type Post struct {
gorm.Model
Title string
UserID uint
}Muitos para um
Da perspectiva do filho, uma publicação pertence a um usuário. Adicione um campo User e a chave estrangeira UserID para expressar isso.
type Post struct {
gorm.Model
Title string
UserID uint
User User
}Um para um
Um relacionamento um para um é semelhante a um para muitos, mas tem um único registro relacionado, como um usuário que possui um perfil. O filho contém a chave estrangeira.
type User struct {
gorm.Model
Profile Profile
}
type Profile struct {
gorm.Model
UserID uint
Bio string
}Muitos para muitos
Usuários e funções se relacionam muitos para muitos por meio de uma tabela de junção. A tag many2many nomeia essa tabela de junção, escrita como gorm:"many2many:user_roles;" entre crases após o campo Roles.
type User struct {
gorm.Model
// Roles field tag: gorm:"many2many:user_roles;"
Roles []Role
}
type Role struct {
gorm.Model
Name string
}Preload
Por padrão, os dados relacionados não são carregados. Preload instrui o GORM a buscar as associações em uma consulta separada, evitando uma busca manual adicional.
var user User
db.Preload("Posts").First(&user, 1)
fmt.Println(len(user.Posts))Preload aninhado
Você pode pré-carregar dados em vários níveis usando um caminho com pontos, carregando as publicações de um usuário e os comentários de cada publicação em uma única cadeia de chamadas.
db.Preload("Posts.Comments").First(&user, 1)Uma simulação executável de associações
GORM precisa de um banco de dados, portanto este exemplo executável simula um relacionamento um para muitos e o pré-carregamento usando fatias mantidas na memória.
package main
import "fmt"
type Post struct {
ID int
UserID int
Title string
}
type User struct {
ID int
Name string
Posts []Post
}
func preload(u *User, all []Post) {
for _, p := range all {
if p.UserID == u.ID {
u.Posts = append(u.Posts, p)
}
}
}
func main() {
u := User{ID: 1, Name: "Ada"}
all := []Post{{1, 1, "Hello"}, {2, 1, "World"}, {3, 2, "Other"}}
preload(&u, all)
fmt.Printf("%s has %d posts\n", u.Name, len(u.Posts))
}Criando com associações
Se você definir o campo da fatia antes de Create, o GORM inserirá o pai e seus filhos juntos e configurará automaticamente as chaves estrangeiras.
user := User{Name: "Ada", Posts: []Post{{Title: "Hi"}}}
db.Create(&user)O problema N+1
Percorrer os registros pais e consultar os filhos a cada iteração causa uma consulta por pai: o problema N+1. Preload resolve isso agrupando a busca dos dados relacionados em uma única consulta adicional.
Modo de associação
A API Association adiciona, substitui, exclui ou limpa registros relacionados sem exigir o tratamento manual de chaves estrangeiras, por exemplo: db.Model(&user).Association("Posts").Append(&post).
Verificação rápida
Teste seus conhecimentos sobre associações.
Recapitulação
Você aprendeu sobre associações:
- Os relacionamentos um para um, um para muitos, muitos para um e muitos para muitos entre modelos
- As chaves estrangeiras são campos de estruturas, como UserID
- Preload carrega associações e evita o problema N+1
- Criar um pai com filhos configura as chaves estrangeiras
- O modo de associação adiciona, substitui ou limpa relações
Aprenda Go com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 51
- Aulas
- 203
Perguntas Frequentes
A aula “Associações” é grátis?
Sim — o texto completo de “Associações” é 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 Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “Associações”?
Modele relacionamentos Você pratica Go 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 Go Academy?
Nenhuma experiência prévia é necessária. Go 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 3 de 4.
Quanto tempo leva a aula “Associações”?
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 Go Academy?
Sim. Cada aula de Go 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.