Go Academy · Lección

Asociaciones

Modele relaciones

Lección 3 de 413 pasos

Asociaciones es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Modelado de relaciones

Las asociaciones de GORM asignan las relaciones entre tablas a los campos de las estructuras. Los cuatro tipos son has one, has many, belongs to y many to many.

  • Exprese las claves foráneas como campos de estructuras
  • Cargue los datos relacionados automáticamente
  • Cree registros relacionados conjuntamente

Has Many

Un usuario tiene muchas publicaciones. El elemento principal contiene un slice de elementos secundarios, y el elemento secundario contiene una clave foránea que apunta al elemento principal.

type User struct {
    gorm.Model
    Name  string
    Posts []Post
}

type Post struct {
    gorm.Model
    Title  string
    UserID uint
}

Belongs To

Desde la perspectiva del elemento secundario, una publicación pertenece a un usuario. Añada un campo User y la clave foránea UserID para expresarlo.

type Post struct {
    gorm.Model
    Title  string
    UserID uint
    User   User
}

Has One

Una relación has-one es similar a has-many, pero con un único registro relacionado, como un usuario que tiene un perfil. El elemento secundario contiene la clave foránea.

type User struct {
    gorm.Model
    Profile Profile
}

type Profile struct {
    gorm.Model
    UserID uint
    Bio    string
}

Many To Many

Los usuarios y los roles se relacionan de muchos a muchos mediante una tabla de unión. La etiqueta many2many da nombre a esa tabla de unión; se escribe como gorm:"many2many:user_roles;" entre comillas invertidas después del campo Roles.

type User struct {
    gorm.Model
    // Roles field tag: gorm:"many2many:user_roles;"
    Roles []Role
}

type Role struct {
    gorm.Model
    Name string
}

Preload

De forma predeterminada, los datos relacionados no se cargan. Preload indica a GORM que obtenga las asociaciones en una consulta independiente, evitando tener que realizar una búsqueda manual adicional.

var user User
db.Preload("Posts").First(&user, 1)
fmt.Println(len(user.Posts))

Preload anidado

Puede precargar varios niveles mediante una ruta con puntos y cargar las publicaciones de los usuarios y los comentarios de cada publicación en una sola cadena de llamadas.

db.Preload("Posts.Comments").First(&user, 1)

Una simulación ejecutable de asociaciones

GORM necesita una base de datos, por lo que este ejemplo ejecutable modela una relación has-many y la precarga mediante slices en memoria.

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))
}

Creación con asociaciones

Si establece el campo slice antes de Create, GORM inserta conjuntamente el elemento principal y sus elementos secundarios, y configura automáticamente las claves foráneas.

user := User{Name: "Ada", Posts: []Post{{Title: "Hi"}}}
db.Create(&user)

El problema N+1

Recorrer los elementos principales y consultar los elementos secundarios en cada iteración provoca una consulta por elemento principal: el problema N+1. Preload lo resuelve agrupando la obtención de los datos relacionados en una sola consulta adicional.

Modo de asociación

La API Association añade, reemplaza, elimina o borra registros relacionados sin gestionar manualmente las claves foráneas; por ejemplo, db.Model(&user).Association("Posts").Append(&post).

Comprobación rápida

Ponga a prueba sus conocimientos sobre asociaciones.

Resumen

Ha aprendido sobre las asociaciones:

  • Las relaciones de modelo has one, has many, belongs to y many2many
  • Las claves foráneas son campos de estructuras como UserID
  • Preload carga las asociaciones y evita el problema N+1
  • Crear un elemento principal con elementos secundarios configura las claves foráneas
  • El modo de asociación añade, reemplaza o borra relaciones
Gratis para empezar

Aprende Go con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Asociaciones» es gratis?

Sí — el texto completo de «Asociaciones» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Asociaciones»?

Modele relaciones Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Go Academy?

No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Asociaciones»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Go Academy?

Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Modelos y AutoMigrate
  2. Operaciones CRUD
  3. Asociaciones
  4. Hooks y scopes
← Volver a Go Academy