Go Academy · Aula

Associações

Modele relacionamentos

Aula 3 de 413 etapas

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
Grátis para começar

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.

Todas as aulas deste curso

  1. Modelos e AutoMigrate
  2. Operações CRUD
  3. Associações
  4. Hooks e escopos
← Voltar para Go Academy