gorm 关系 Many to Many 多对多

冷暖自知 提交于 2020-04-15 10:05:17

【推荐阅读】微服务还能火多久?>>>

多对多(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" IN (2)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!