gorm 关系 Many to Many 多对多

原创
2019/05/09 20:31
阅读数 8.8K

多对多(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)
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部