当前位置:网站首页>【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方法的参数为要添加的关联模型类型,对应关联模型的切片变量名。
边栏推荐
- Chatting embarrassing scenes, have you encountered it?Teach you to get the Doutu emoticon package with one click, and become a chat expert
- In programming languages, the difference between remainder and modulo
- Jinshanyun earthquake, the epicenter is in bytes?
- 发送激活邮件「建议收藏」
- 台风生成,广州公交站场积极开展台风防御安全隐患排查
- Flask introductory learning tutorial
- TF生成均匀分布的tensor
- 重要的不是成为海贼王,而是像路飞一样去冒险
- Simple questions peek into mathematics
- Interviewer: How to deal with Redis big key?
猜你喜欢

JSON 基本使用

CVPR22 Oral|通过多尺度token聚合分流自注意力,代码已开源

AI Knows Everything: Building and Deploying a Sign Language Recognition System from Zero

AI+医疗:使用神经网络进行医学影像识别分析

The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition

4D Summary: 38 Knowledge Points of Distributed Systems

APP automation test framework - UiAutomator2 introductory

In-depth analysis of Apache EventMesh cloud-native distributed event-driven architecture

一文让你快速了解隐式类型转换【整型提升】!

几种绘制时间线图的方法
随机推荐
Chatting embarrassing scenes, have you encountered it?Teach you to get the Doutu emoticon package with one click, and become a chat expert
Reinforcement Learning Weekly Issue 57: DL-DRL, FedDRL & Deep VULMAN
6个规则去净化你的代码
JSON 基本使用
TRUNCATE表之后空间未释放
JS解混淆-AST还原案例
发送激活邮件「建议收藏」
AI Knows Everything: Building and Deploying a Sign Language Recognition System from Zero
unit test
2022 首期线下 Workshop!面向应用开发者们的数据应用体验日来了 | TiDB Workshop Day
SQLi-LABS Page-2 (Adv Injections)
Tensorflow中使用convert_to_tensor去指定数据的类型
Interpretation of the paper (DropEdge) "DropEdge: Towards Deep Graph Convolutional Networks on Node Classification"
【微服务~Nacos】Nacos服务提供者和服务消费者
The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition
[Cloud Native] 4.2 DevOps Lectures
abstract class or interface
Bean life cycle
ACM MM 2022 | Cloud2Sketch: 长空云作画,AI笔生花
laravel 表迁移报错[通俗易懂]