1. 程式人生 > >gorm 關係 Many to Many 多對多

gorm 關係 Many to Many 多對多

多對多(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