gorm 關係 Many to Many 多對多
阿新 • • 發佈:2019-05-09
多對多(Many to Many)在兩個模型之間增加一個 join 表(中間表)。
例如,如果您的應用程式包含使用者和語言,並且使用者可以說多種語言,並且許多使用者可以說出某種語言,使用者和語言就有多對多的關係。
定義模型:
// 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 表,模式為:
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 又去建立一遍。
查詢記錄
獲取 id 為 2 的 user 的語言:
var user User
db.Find(&user, 2)
var languages []Language
db.Model(&user).Related(&languages, "Languages")
查詢關聯用的 sql:
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&q