例如,您的应用包含了 user 和 language,且一个 user 可以说多种 language,多个 user 也可以说一种 language。
// User 拥有并属于多种 language,`user_languages` 是连接表 type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` }
type Language struct { gorm.Model Name string }
当使用 GORM 的 AutoMigrate 为 User 创建表时,GORM 会自动创建连接表
反向引用
声明
// User 拥有并属于多种 language,`user_languages` 是连接表 type User struct { gorm.Model Languages []*Language `gorm:"many2many:user_languages;"` }
type Language struct { gorm.Model Name string Users []*User `gorm:"many2many:user_languages;"` }
检索
// 检索 User 列表并预加载 Language funcGetAllUsers(db *gorm.DB) ([]User, error) { var users []User err := db.Model(&User{}).Preload("Languages").Find(&users).Error return users, err }
// 检索 Language 列表并预加载 User funcGetAllLanguages(db *gorm.DB) ([]Language, error) { var languages []Language err := db.Model(&Language{}).Preload("Users").Find(&languages).Error return languages, err }
重写外键
对于 many2many 关系,连接表会同时拥有两个模型的外键,例如:
type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` }