当前位置:网站首页>【GORM】模型关系-HasMany关系
【GORM】模型关系-HasMany关系
2022-08-09 21:54:00 【Viva Python】
一、概述
HasMany
与另一个模型建立一对多的连接,拥有者可以拥有零个或多个关联模型。
二、模型建立
依旧以User
和CreditCard
为例,一个User
可以拥有多张CreditCard
。HasMany
关系模型的实现主要在拥有者模型中定义。
1. 拥有者模型
实现
HasMany
模型,拥有者需要拥有以下字段:(1) 外键:默认为被拥有者的主键,在被拥有者模型中定义,在被拥有者模型切片变量中标注。
(2) 引用:默认为拥有者的主键,在拥有者模型中定义,在被拥有者模型切片变量中标注。
(3) 被拥有者模型切片变量;
以下是拥有者模型
User
的定义:以
CreditCard
模型中的UserID
作为外键,以ID
作为索引(默认)。type User struct { ID uint `gorm:"primary_key"` Name string Password string `gorm:"<-;->:false"` CreditCards []CreditCard `gorm:"foreignKey:UserID;references:ID"` }
2. 被拥有者模型(关联模型)
实现
HasMany
模型,被拥有者按照正常的逻辑定义,必要时可以添加拥有者模型的外键,如上User
模型中使用CreditCard
模型中的UserID
变量作为外键。与上
User
对应的CreditCard
模型如下:type CreditCard struct { ID uint `gorm:"primary_key"` UserID uint `gorm:"->:false;<-"` Number string }
三、相关操作
1. 创建
- 定义完整的实例对象,调用
Save
方法保存。
func TestSaveUser() {
user := User{
Name: "Jason",
Password: "123",
CreditCards: []CreditCard{
{
Number: "1234567890"},
{
Number: "0987654321"},
},
}
err := SaveUser(user)
if err != nil {
log.Println("用户保存失败!")
} else {
log.Println("用户保存成功!")
}
}
func SaveUser(user User) error {
var err error
err = db.Save(&user).Error
return err
}
2. 查询
- 需要加载关联模型,使用
Preload
方法。
func GetUserByName(name string) (User, error) {
var user User
var err error
err = db.Where("name = ?", name).Preload("CreditCards").First(&user).Error
return user, err
}
3. 添加关联模型实例
- 向已有的记录添加关联模型实例,如向已有的
User
记录添加CreditCard
记录。
func AppendCardByUser(user User, card CreditCard) error {
var err error
err = db.Model(&user).Association("CreditCards").Append(&card)
return err
}
其中Association
方法的参数为要添加的关联模型类型,对应关联模型的切片变量名。
边栏推荐
猜你喜欢
2022 首期线下 Workshop!面向应用开发者们的数据应用体验日来了 | TiDB Workshop Day
“稚晖君”为2022昇腾AI创新大赛打call&nbsp;期待广大开发者加入
Shanghai Konan SmartRocket series product introduction (3): SmartRocket iVerifier computer interlocking system verification tool
孙正义亏掉1500亿:当初投贵了
几种绘制时间线图的方法
阿里云架构师金云龙:基于云XR平台的视觉计算应用部署
简单问题窥见数学
The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition
聊天尬死名场面,你遇到过吗?教你一键获取斗图表情包,晋升聊天达人
Js fifteen interview questions (with answers)
随机推荐
【EF】数据表全部字段更新与部分字段更新
一文让你快速了解隐式类型转换【整型提升】!
面试官:MySQL 中 update 更新,数据与原数据相同时会执行吗?大部分人答不上来!
mysql multi-table left link query
Usage of placeholder function in Tensorflow
NIO Cup 2022 Nioke Summer Multi-School Training Camp 7 CFGJ
The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition
Cookie, session, token
Tensorflow中placeholder函数的用法
js十五道面试题(含答案)
MLOps的演进历程
[Microservice~Nacos] Configuration Center of Nacos
README_Albumentations
How to Make Your Company Content GDPR Compliant
Basic operations of openGauss database (super detailed)
单元测试
Quotefancy ,提供鼓舞人心语录的壁纸网站 - 倾城之链
AI Knows Everything: Building and Deploying a Sign Language Recognition System from Zero
APP automation test framework - UiAutomator2 introductory
Reinforcement Learning Weekly Issue 57: DL-DRL, FedDRL & Deep VULMAN