golang-gorm-belong

属于(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 需要写在所有者字段上(此处为User字段)。

创建记录

一起创建 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 了,与一起创建的效果等同。

 

参考:https://msd.misuland.com/pd/3181438612956776724

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值