gorm 關係 Many to Many 多對多

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

查詢記錄

獲取 id 爲 2 的 user 的語言:

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)
相關文章
相關標籤/搜索