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
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?