文档章节

gorm 关系 belongs to 属于

electricface
 electricface
发布于 05/09 10:07
字数 728
阅读 6
收藏 0

属于(belongs to)关联建立与另一模型的一对一连接,使得声明模型的每个实例“属于”另一模型的一个实例。

例如,如果您的应用程序包含用户和配置文件,则每个配置文件只能分配给一个用户。

Profile 属于 User, User 是 Profile 的所有者。

定义模型:

type User struct {
	gorm.Model
	Name string
}

// Profile belongs to User, UserID is foreign key
// Profile 属于 User,UserID 是外键
type Profile struct {
	gorm.Model
	Name   string
	User   User
	UserID uint
}

profiles 表的 user_id 列是外键,它引用 users 表的 id 列。

外键

要定义属于关系,外键必须存在,默认外键 = 所有者(此处为 User)的类型 + 其主键。

对于上面的示例,要定义属于 User 的模型,外键应为 User + ID = UserID。

外键字段类型最好与它引用的字段类型一致,这里 Profile.UserID 的类型与 User.ID 的类型都为 uint。

GORM提供了一种自定义外键名的方法,例如:

type User struct {
  gorm.Model
  Name string
}

type Profile struct {
  gorm.Model
  Name      string
  User      User `gorm:"foreignkey:UserRefer"` // use UserRefer as foreign key
  UserRefer uint
}

把 profiles 表的引用 users 表 id 列的外键改成 user_refer(默认应该为user_id)。tag 需要写在从属者结构体的类型为所有者的字段上,这里是 Profile 的 User 字段。

关联外键

关联外键指与外键有关联的键,被外键所引用的键。

对于属于关系,GORM 通常使用所有者的主键作为关联外键,例如,它是用户的ID。

将配置文件分配给用户时,GORM 会将用户 ID 保存到配置文件的 UserID 字段中。

您可以使用标记 association_foreignkey 更改它,例如:

type User struct {
  gorm.Model
  Refer int
  Name string
}

type Profile struct {
  gorm.Model
  Name      string
  User      User `gorm:"association_foreignkey:Refer"` // use Refer as association foreign key
  UserRefer string
}

users 表的 refer 字段成为关联外键,Profile 的外键变成 User + Refer = UserRefer。

创建记录

一起创建 User 和 Profile:

p1 := &Profile{
	User: User{
		Name: "swt",
	},
	Name: "swt swt",
}

db.Create(p1)

当 p1 的 User 字段不为空时,db.Create(p1) 调用在 profiles 表中创建 p1 记录前,会先在 users 表中创建 p1.User 记录。之后 p1 及 p1.User 各个字段都被填上正确的值。

分开创建 User 和 Profile:

u1 := &User{Name: "swt"}
db.Create(u2)

p1 := &Profile{UserId: u1.ID, Name: "swt swt"}
db.Create(p1)

当 p1 的 User 字段为空时,db.Create(p1) 调用在 profiles 表中创建 p1 记录前,不会先创建 user 了。

查找记录

你可以用 Related 方法查找 belongs to 关联

var profile Profile
user := &User{ ID: 111 }
db.Model(&user).Related(&profile)
// SELECT * FROM profiles WHERE user_id = 111;

将根据 user 的 ID 查找相关的 profile。

© 著作权归作者所有

electricface

electricface

粉丝 1
博文 32
码字总数 21614
作品 0
武汉
私信 提问
加载中

评论(1)

electricface
electricface
附属者是带有外键的
gorm 关系 has one 有一个

有一个(has one)关联也建立了与另一个模型的一对一连接,但有一些不同的语义(和后果)。此关联表示模型的每个实例包含或拥有另一个模型的一个实例。 例如,如果您的应用程序包括用户和信用...

electricface
05/09
0
0
gorm 关系 Many to Many 多对多

多对多(Many to Many)在两个模型之间增加一个 join 表(中间表)。 例如,如果您的应用程序包含用户和语言,并且用户可以说多种语言,并且许多用户可以说出某种语言,用户和语言就有多对多...

electricface
05/09
0
0
Yii 多表关联relations

1,首先多表关联是在models/xx.php的relations里配置的。而且是互配,但有区别。 格式: 'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options) 需要弄清楚的......

rooney
2014/07/12
0
0
Yii 多表关联relations

//在User的model里定义,如下关联关系 'doingOutsources' => array(self::MANYMANY, 'Outsource', 'outsourceuser(userid, outsourceid)', 'condition' => "doingOutsources.status_id IN("......

daniel-john
2014/03/18
0
0
Grails 1.2参考文档速读系列

一个很好的Grails中文参考资料。 Grails 1.2参考文档速读(1):第1、2章 Grails 1.2参考文档速读(2):配置基础和环境 Grails 1.2参考文档速读(3):日志配置 Grails 1.2参考文档速读(4...

groovyland
2010/02/25
359
1

没有更多内容

加载失败,请刷新页面

加载更多

ECS事件通知之创建失败事件

ECS提供了批量实例创建接口,可以一次调用创建最多100台实例。批量创建接口可以完成批量实例的创建、启动、IP分配等流程,可以快速完成实例资源的扩容。 在实例的创建过程中(实际后台异步创...

阿里云官方博客
15分钟前
1
0
InnoDB索引

如果我们要去一本书中翻看某部分的内容,最简单的方法就是先翻到目录也就是“索引”部分,找到对应的页码,数据库也是如此。 本文以mysql为例来表述InnoDB 索引基础 在mysql中存储引擎先使用...

周慕云
19分钟前
1
0
idea常用操作

设置 范型提示 Settings->Inspetions->raw use of parameterized class 当前项目maven设置 Settings->Builde,Execution,Deployment->Build Tools->Maven 全局模式maven设置 插件 GenerateAl......

大头鬼_yc
31分钟前
1
0
某专利检索分析系统设计回顾

ES版本选择:1.6.0(当时的最新版本) 系统部署: 该引擎以webservice的形式对外提供服务,与web系统隔离 如何限制访问数量 引擎线程池限制同时查询数量,拒绝超量(抛异常,捕获到返回查询等...

Java搬砖工程师
34分钟前
3
0
RE 逆向工程初学者指南:方法和工具

简评: RE 两种分析,静态、动态。好好分析静态因为能够解决 70 % 的问题。介绍了一些工具和方法。Enjoy yourself. 最近几天,我决定试水逆向工程,即使在计算机和编程相关领域有一定的基础,...

极光推送
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部