一对一关系
一对一关系
一对一关系比较少,一般用于表的扩展
例如一张用户表,有很多字段
那么就可以把它拆分为两张表,常用的字段放主表,不常用的字段放详情表
表结构搭建
type User struct {
ID uint
Name string
Age int
Gender bool
UserInfo UserInfo // 通过UserInfo可以拿到用户详情信息
}
type UserInfo struct {
UserID uint // 外键
ID uint
Addr string
Like string
}
添加记录
添加用户,自动添加用户详情
DB.Create(&User{
Name: "枫枫",
Age: 21,
Gender: true,
UserInfo: UserInfo{
Addr: "湖南省",
Like: "写代码",
},
})
添加用户详情,关联已有用户
这个场景特别适合网站的注册,以及后续信息完善
刚开始注册的时候,只需要填写很基本的信息,这就是添加主表的一条记录
注册进去之后,去个人中心,添加头像,修改地址...
这就是添加附表
DB.Create(&UserInfo{
UserID: 2,
Addr: "南京市",
Like: "吃饭",
})
当然,也可以直接把用户对象传递进来
我们需要改一下表结构
type User struct {
ID uint
Name string
Age int
Gender bool
UserInfo UserInfo // 通过UserInfo可以拿到用户详情信息
}
type UserInfo struct {
User *User // 要改成指针,不然就嵌套引用了
UserID uint // 外键
ID uint
Addr string
Like string
}
不限于重新迁移,直接添加即可
var user User
DB.Take(&user, 2)
DB.Create(&UserInfo{
User: &user,
Addr: "南京市",
Like: "吃饭",
})
查询
一般是通过主表查副表
var user User
DB.Preload("UserInfo").Take(&user)
fmt.Println(user)