GORM - association

1.1. BelongTo

type User struct {
  gorm.Model
  Profile   Profile // BelongTo, key = this.ProfileID
  ProfileID int
}

type Profile struct {
  gorm.Model
}

db.Model(&u).Related(&p)
//// SELECT * FROM profiles WHERE id = 111; // p.id = u.ProfileID

1.2. HasOne

type User struct {
    gorm.Model
    CreditCard   CreditCard // hasOne, key = c.UserID
}

type CreditCard struct {
    gorm.Model
    UserID   uint
}

var c CreditCard
db.Model(&u).Related(&c, "CreditCard")
//// SELECT * FROM credit_cards WHERE user_id = 123; // c.user_id = u.id

1.3. HasMany

type User struct {
    gorm.Model
    Emails   []Email  // hasMany, key = e.UserID
}

type Email struct {
    gorm.Model
    UserID  uint
}

db.Model(&u).Related(&es)
//// SELECT * FROM emails WHERE user_id = 111; // e.user_id = u.id
  1. Many2Many

type User struct {
    gorm.Model
    Languages         []Language `gorm:"many2many:user_languages;"`
}

type Language struct {
    gorm.Model
}

db.Model(&u).Related(&ls, "Languages")
//// SELECT * FROM "languages" 
////    INNER JOIN "user_languages" 
////    ON "languages"."id" = "user_languages"."language_id"
////    WHERE "user_languages"."user_id" = 111

2. polymorphic

type Cat struct {
  Id    int
  Toy   Toy `gorm:"polymorphic:Owner;"`
}

type Dog struct {
  Id   int
  Toy  Toy `gorm:"polymorphic:Owner;"`
}

type Toy struct {
  Id        int
  OwnerId   int
  OwnerType string
}

3. Association CRUD

var u User

db.Model(&u).Association("Languages")
// 如果这些条件不匹配,将返回一个错误,检查它:
// db.Model(&user).Association("Languages").Error


// Query
db.Model(&u).Association("Languages").Find(&languages)


// Append - 添加新的many2many, has_many关联, 会替换掉当前 has_one, belongs_to关联
db.Model(&u).Association("Languages").Append([]Language{languageZH, languageEN})
db.Model(&u).Association("Languages").Append(Language{Name: "DE"})


// Delete - 删除源和传递的参数之间的关系,不会删除这些参数
db.Model(&u).Association("Languages").Delete([]Language{languageZH, languageEN})
db.Model(&u).Association("Languages").Delete(languageZH, languageEN)


// Replace - 使用新的关联替换当前关联
db.Model(&u).Association("Languages").Replace([]Language{languageZH, languageEN})
db.Model(&u).Association("Languages").Replace(Language{Name: "DE"}, languageEN)


// Count - 返回当前关联的计数
db.Model(&u).Association("Languages").Count()


// Clear - 删除源和当前关联之间的关系,不会删除这些关联
db.Model(&u).Association("Languages").Clear()

Last updated

Was this helpful?