文档章节

gorm 关系 Many to Many 多对多

electricface
 electricface
发布于 05/09 20:31
字数 342
阅读 160
收藏 0

多对多(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)

© 著作权归作者所有

electricface

electricface

粉丝 2
博文 37
码字总数 33242
作品 0
武汉
私信 提问
使用 Grails 开发 Google App Engine 应用

简介: Grails 作为 Web 框架的新生力量,已经被越来越多的开发人员所接受。而 Google App Engine(以下简称 GAE)作为云计算的平台,为应用提供了广阔的扩展空间。如何将二者擦出绚丽的火花...

红薯
2010/06/26
1K
0
EF架构~多对多关系的实现与更新原理(多主键关系表不见)

对于多对多关系,我们需要引入第三张表,一般我们称它为关系表,关系表不需要自已的主键,而是通过相关表的主键进行组合,我们一般称为多主键,下面看一下菜单表与角色表,它们是一种多对多关...

mcy247
2017/12/05
0
0
Hibernate 级联和关系维护

1、Hibernate中的级联操作: 在Hibernate中,针对持久化实体的配置文件中有Cascade这样一个属性,就是级联,也就是说在操作当前实体时,针对当前实体的操作会影响到相应配置的关联实体,比如...

Winnie007
2015/08/28
116
0
Go组件学习——gorm四步带你搞定DB增删改查

1、简介 ORM Object-Relationl Mapping, 它的作用是映射数据库和对象之间的关系,方便我们在实现数据库操作的时候不用去写复杂的sql语句,把对数据库的操作上升到对于对象的操作。 gorm gor...

Jackie_Zheng
08/04
0
0
【MySql】8.多对多关系表

多对多关系: 比如在常见的订单管理数据库当中“产品”表和“订单”表之间的关系。单个订单中可以包含多个产品。另一方面,一个产品可能出现在多个订单中。因此,对于“订单”表中的每条记录...

Jannie_xx
2014/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈Adapter适配器模式

一、前言 适配器模式分为两类,所谓“适配”就是适当的配合或者恰当的配合,想一下电源的适配器,完成的作用是将交流电220V转化成不同的直流电压,来对手机、电脑、台灯等充电,如果没有这些...

青衣霓裳
14分钟前
1
0
Kubernetes+Docker+Istio 容器云实践

随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求。近年来,互联网、移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于Kubernetes+Docker的...

宜信技术学院
16分钟前
1
0
工作流升级登场,云盒子让文件流转更顺畅

云盒子企业网盘作为深耕企业私有云盘领域的老选手, 深谙企业用户对文档管理的细致化追求, 同时从日积月累的各行各业用户口中,收集产品使用体验和痛点, 将“用户体验”贯穿整个网盘产品的设计...

yhz66
21分钟前
0
0
linux:nohup 不生成 nohup.out的方法

nohup java -jar /xxx/xxx/xxx.jar >/dev/null 2>&1 & 关键在于最后的 >/dev/null 2>&1 部分,/dev/null是一个虚拟的空设备(类似物理中的黑洞),任何输出信息被重定向到该设备后,将会石沉...

OSC知行合一
23分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部