Go Academy · Les

Associaties

Modelleer relaties

Les 3 van 413 stappen

Associaties is een gratis Go Academy-les op CoddyKit. Dit is les 3 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Go Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Go Academy bevat in totaal 4 lessen.

Relaties modelleren

GORM koppelt relaties tussen tabellen aan velden van structs. De vier soorten zijn één-op-één, één-op-veel, veel-op-één en veel-op-veel.

  • Druk vreemde sleutels uit als velden van structs
  • Laad gerelateerde gegevens automatisch
  • Maak gerelateerde records samen aan

Eén-op-veel

Een gebruiker heeft veel berichten. Het bovenliggende record bevat een slice met onderliggende records en het onderliggende record bevat een vreemde sleutel terug naar het bovenliggende record.

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

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

Behoort bij

Vanuit het perspectief van het kindrecord behoort een bericht bij een gebruiker. Voeg een veld User en de vreemde sleutel UserID toe om dit uit te drukken.

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

Eén-op-één

Een één-op-éénrelatie lijkt op een één-op-veelrelatie, maar heeft één gerelateerd record, zoals een gebruiker met één profiel. Het kindrecord bevat de vreemde sleutel.

type User struct {
    gorm.Model
    Profile Profile
}

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

Veel-op-veel

Gebruikers en rollen hebben een veel-op-veelrelatie via een koppeltabel. De tag many2many benoemt die koppeltabel, geschreven als gorm:"many2many:user_roles;" tussen backticks na het veld Roles.

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

type Role struct {
    gorm.Model
    Name string
}

Preload

Standaard worden gerelateerde gegevens niet geladen. Preload vertelt GORM dat het de relaties in een afzonderlijke query moet ophalen, zodat je dit niet handmatig hoeft te doen.

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

Geneste Preload

Je kunt meerdere niveaus vooraf laden met een pad met punten, waarmee je de berichten van een gebruiker en de reacties op elk bericht in één keten van aanroepen laadt.

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

Een uitvoerbare simulatie van relaties

GORM heeft een database nodig, dus dit uitvoerbare voorbeeld modelleert een één-op-veelrelatie en het vooraf laden daarvan met slices in het geheugen.

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

Maken met relaties

Als je het sliceveld instelt voordat je Create aanroept, voegt GORM het bovenliggende record en de onderliggende records samen in en koppelt het automatisch de vreemde sleutels.

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

Het N+1-probleem

Als je door bovenliggende records loopt en per iteratie de onderliggende records opvraagt, ontstaat één query per bovenliggend record: het N+1-probleem. Preload lost dit op door het ophalen van gerelateerde gegevens in één extra query te bundelen.

Relatiemodus

De Association-API voegt gerelateerde records toe, vervangt ze, verwijdert ze of wist ze zonder dat je vreemde sleutels handmatig hoeft te beheren, bijvoorbeeld db.Model(&user).Association("Posts").Append(&post).

Korte controle

Test je kennis van relaties.

Samenvatting

Je hebt geleerd wat relaties zijn:

  • één-op-één-, één-op-veel-, veel-op-één- en veel-op-veelrelaties tussen modellen
  • Vreemde sleutels zijn velden van structs, zoals UserID
  • Preload laadt relaties en voorkomt het N+1-probleem
  • Bij het maken van een bovenliggend record met onderliggende records worden vreemde sleutels gekoppeld
  • In de relatiemodus kun je relaties toevoegen, vervangen of wissen
Gratis beginnen

Leer Go met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
51
Lessen
203

Veelgestelde vragen

Is de les “Associaties” gratis?

Ja — je kunt hier op het web alle 3 lessen van het leerpad Go Academy, waaronder “Associaties”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Go Academy bevat in totaal 4 lessen.

Wat leer ik in “Associaties”?

Modelleer relaties Je oefent met Go Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Go Academy te beginnen?

Ervaring vooraf is niet nodig. Go Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 3 van 4.

Hoe lang duurt de les “Associaties”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Go Academy?

Ja. Elke les over Go Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Modellen en AutoMigrate
  2. CRUD-bewerkingen
  3. Associaties
  4. Hooks en scopes
← Terug naar Go Academy