多對多(Many to Many)在兩個模型之間增長一個 join 表(中間表)。sql
例如,若是您的應用程序包含用戶和語言,而且用戶能夠說多種語言,而且許多用戶能夠說出某種語言,用戶和語言就有多對多的關係。code
定義模型:orm
// 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 }
用 AutoMigrate 方法 User 表,會自動建立 user_languages 表,模式爲:string
CREATE TABLE "user_languages" ( "user_id" integer, "language_id" integer, PRIMARY KEY ("user_id","language_id") );
langEN := Language{Name: "EN"} db.Create(&langEN) langCN := Language{Name: "CN"} db.Create(&langCN) u1 := &User{ Name: "user1", Languages: []Language{ langEN, langCN, }, } db.Create(u1) u2 := &User{ Name: "user2", Languages: []Language{ langCN, }, } db.Create(u2)
調用 db.Create(user) 時,不會像 has one 關係那樣,把 user.Languages 中的 Language 又去建立一遍。table
var user User db.Find(&user, 2) var languages []Language db.Model(&user).Related(&languages, "Languages")
查詢關聯用的 sql:class
SELECT "languages".* FROM "languages" INNER JOIN "user_languages" ON "user_languages"."language_id" = "languages"."id" WHERE "languages"."deleted_at" IS NULL AND "user_languages"."user_id" IN (2)