// User has and belongs to many languages, `user_languages` is the join table type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` }
// User has and belongs to many languages, use `user_languages` as join table type User struct { gorm.Model Languages []*Language `gorm:"many2many:user_languages;"` }
type Language struct { gorm.Model Name string Users []*User `gorm:"many2many:user_languages;"` }
取得
// Retrieve user list with eager loading languages funcGetAllUsers(db *gorm.DB) ([]User, error) { var users []User err := db.Model(&User{}).Preload("Languages").Find(&users).Error return users, err }
// Retrieve language list with eager loading users funcGetAllLanguages(db *gorm.DB) ([]Language, error) { var languages []Language err := db.Model(&Language{}).Preload("Users").Find(&languages).Error return languages, err }
外部キーのオーバーライド
多対多リレーションシップでは、結合テーブルは2つのモデルを参照する外部キーを所有します。例:
type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` }
// Change model Person's field Addresses' join table to PersonAddress // PersonAddress must defined all required foreign keys or it will raise error err := db.SetupJoinTable(&Person{}, "Addresses", &PersonAddress{})