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" IN (2)

转载于:https://my.oschina.net/u/1248114/blog/3047676

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值