// User は複数の言語を所有し、かつ言語に属しています。`user_languages` が結合テーブルになります type User struct { gorm.Model Languages []Language `gorm:"many2many:user_languages;"` }
type Language struct { gorm.Model Name string }
GORMの AutoMigrate を使用して User テーブルを作成する場合、GORMは自動的に結合テーブルを作成します。
後方参照(Back-Reference)
Declare
// User は複数の言語を所有し、かつ言語に属しています。`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;"` }
Retrieve
// 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 }
外部キーのデフォルト設定を上書きする
many2many リレーションでは、結合テーブルは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{})