Gorm的关联模型

news2024/11/18 9:34:08

Belongs To

将一个模型与另一个模型建立一对一的关系

例如:一张银行卡只能分配给一个用户,在User结构体里面创建一个CreditCardId外键关系,然后在User结构体里面嵌套一个CreditCard结构体

// Belongs To
// 用户
type User struct {
	gorm.Model
	CreditCardId int64
	CreditCard   CreditCard
}
// 银行卡
type CreditCard struct {
	gorm.Model
	Number string
}

根据结构体创建对应的表结构

db.AutoMigrate(&User{})

users表:
在这里插入图片描述
credit_cards表:
在这里插入图片描述

插入一条数据

user := User{
	CreditCardId: 100,
	CreditCard: CreditCard{
		Number: "123456",
	},
}
db.Create(&user)

users表:
在这里插入图片描述
credit_cards表:
在这里插入图片描述

根据id查询一条数据

需要使用预加载,否则嵌套结构体里面的内容将不会被查询出来

var user User
err = db.Preload("CreditCard").Where("id=?", 1).Find(&user).Error
if err != nil {
	fmt.Printf("err: %v\n", err)
}
fmt.Printf("user: %v\n", user)

注意:在对表进行删除的时候应该先删除父表(users表),再删除子表(credit_cards)

Has One

同样的,Has One也是用来建立一对一的关系,这种关联表明一个模型的每个实例都包含或拥有另一个模型的一个实例。与Belongs To不同的是,外键的位置是在嵌套结构体的内部

// Has One
// 用户
type User struct {
	gorm.Model
	CreditCard CreditCard
}
//银行卡
type CreditCard struct {
	gorm.Model
	Number string
	UserID int64
}

根据结构体创建对应表结构

db.AutoMigrate(&User{}, &CreditCard{})

users表:
在这里插入图片描述
credit_cards表
在这里插入图片描述

插入一条数据

关于结构体的内容,属性是gorm.model的内容时不必进行赋值,由于CreditCard属于内部嵌套结构体,所以UserID无需指定,值是User结构体的ID值

user := User{
	CreditCard: CreditCard{
		Number: "100",
	},
}
db.Create(&user)

users表
在这里插入图片描述
credit_cards表
在这里插入图片描述

查询数据仍然需要使用预加载

var user User
err = db.Preload("CreditCard").Where("id=?", 1).Find(&user).Error
if err != nil {
	fmt.Printf("err: %v\n", err)
}
fmt.Printf("user: %v\n", user)

Has Many

Has Many将一个模型与另一个模型建立一对多的关系,嵌套结构体是一个切片类型,而在嵌套内部结构体将通过一个id保证与外部结构体的关系
银行卡的例子说明,每一个人可以拥有很多张银行卡,但是每张银行卡都有对应属于自己的id值

// Has Many
type User struct {
	gorm.Model
	CreditCard []CreditCard
}

type CreditCard struct {
	gorm.Model
	Number string
	UserID int64
}

根据结构体创建对应表结构

建表的时候与Has One键的表一样

db.AutoMigrate(&User{}, &CreditCard{})

插入一条数据

user := User{
	CreditCard: []CreditCard{
		{Number: "100"}, {Number: "101"}, {Number: "101"},
	},
}
db.Create(&user)

对应users表,创建一个一个用户,对用credit_cards表,将创建三条银行卡数据

查询数据需要使用预加载

var user User
err = db.Preload("CreditCard").Where("id=?", 1).Find(&user).Error
if err != nil {
	fmt.Printf("err: %v\n", err)
}
fmt.Printf("user: %v\n", user)

Many To Many

Many to Many 会在两个 model 中添加一张连接表

例如:在一个大小合适中的关系网中,一个人可以有多个群聊,每个群聊都有多个不同的人。

// Many To Many
type User struct {
	gorm.Model
	ChatGroups []ChatGroup `gorm:"many2many;"`
}
type ChatGroup struct {
	gorm.Model
	Name string
}

根据结构体创建对应表结构

db.AutoMigrate(&User{})

使用User结构体将创建三个表users表,chat_groups表,user_chat_group

插入一条数据

var user = User{
	ChatGroups: []ChatGroup{
		{Name: "幸福一家人"}, {Name: "研究生小分队"}, {Name: "钓鱼佬永不空军"},
	},
}
db.Create(&user)

users表
chat_groups表
关系对应表

对于第一次插入数据,没有指定的id将被自动赋值,默认升序,第二次插入数据:新建一个用户id=2,用户的群聊是id等于1,2的两个群聊

var user = User{
	Model: gorm.Model{
		ID: 2,
	},
	ChatGroups: []*ChatGroup{
		{
			Model: gorm.Model{
				ID: 1,
			},
		},
		{
			Model: gorm.Model{
				ID: 2,
			},
		},
	},
}
db.Create(&user)

此时,users表中添加一条数据,chat_groups表中没有新数据插入,user_chat_group对应关系表中插入两条数据
对应关系表

查询数据

var chats []ChatGroup
//查询指定群聊,并且预加载群聊里面的人
db.Preload("User").Where("id=?", 1).Find(&chats).Association("ChatGroup")
fmt.Printf("chats: %v\n", chats)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/441935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十个超级好用的Javascript技巧

概览:在实际的开发工作过程中,积累了一些常见又超级好用的Javascript技巧和代码片段,包括整理的其他大神的JS使用技巧,今天筛选了10个,以供大家参考。 动态加载JS文件 在一些特殊的场景下,特别是一些库和…

自己动手做chatgpt:解析gpt底层模型transformer的输入处理

前面我们完成了一些基本概念,如果你对深度学习的基本原理还不了解,你可以通过这里获得更多信息,由于深度学习的教程汗牛充栋,因此我在这里不会重复,而是集中精力到chatgpt模型原理的分析,实现和实践上。Cha…

初识C语言————3

博主这篇文章浅谈一下自己对函数和数组的理解。之后会详细说明。 文章目录 一、函数 二、数组 1、数组定义 2、数组的下标 3、数组的使用 一、函数 函数可以理解为一个模块的代码&#xff0c;完成一个独立的功能。 #include <stdio.h> int main() {int num1 0;int num…

ASEMI代理ADM3051CRZ-REEL7原装ADI车规级ADM3051CRZ-REEL7

编辑&#xff1a;ll ASEMI代理ADM3051CRZ-REEL7原装ADI车规级ADM3051CRZ-REEL7 型号&#xff1a;ADM3051CRZ-REEL7 品牌&#xff1a;ADI/亚德诺 封装&#xff1a;SOIC-8 批号&#xff1a;2023 引脚数量&#xff1a;8 安装类型&#xff1a;表面贴装型 ADM3051CRZ-REEL7汽…

【Python】读取rdata类型数据转为csv excel格式文件, 无需安装r语言基于pyreadr+pandas实现数据分析(保姆级注释)

目录 环境配置取得数据名 datas.keys()取得pandas的DataFrame类型数据一些数据分析例程供入门同学学习转化为csv excel格式所有数据 转化为csv取前面100行数据 快速测试能否转化csv取前面100行数据 快速测试能否转化xlsx 完整例程总结 欢迎关注 『Python』 系列&#xff0c;持续…

简述AutoGPT原理(提示词)

启动时需要设置三个项目&#xff1a;机器人名字、设定给机器人的角色、要完成的目标。 根据你的设定利用ChatGPT进行下一步的抉择&#xff0c;具体的&#xff0c;实际上归功于提示词&#xff1a; 下面这段提示词在干什么呢&#xff1f; 将设定的名字、角色、目标告诉ChatGPT&…

【U8+】用友U8+对账不平案例及方法总结

【问题需求】 在使用用友U8软件过程中&#xff0c;由于软件涉及到多方面的对账。 所以经常会遇到期初或结账时对账不平。 【经验分享】 在众多对账中&#xff0c; 只有当【总账上下级】&#xff08;即&#xff1a;总账与明细账对账&#xff09;不平的时候&#xff0c; 软件才…

春秋云境:CVE-2022-26965(后台RCE)

目录 一、题目 二、 利用cms主题构造木马 一、题目 介绍&#xff1a; Pluck-CMS-Pluck-4.7.16 后台RCE 进入题目&#xff1a; cms页面 点击admin进行登录&#xff1a; 弱口令admin登录&#xff1a; 成功登录进去&#xff1a; 国产化一下&#xff1a; 选项---选择主题 点击…

漏洞分析丨cve20144113

一、漏洞简述 Microsoft Windows下的 win32k.sys是Windows子系统的内核部分&#xff0c;是一个内核模式设备驱动程序&#xff0c;它包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处理内存中的对象&#xff0c;则存在一个特权提升…

js对象案例练习

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;python学不会123 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习…

SQL Server的日志传送

日志传送和复制 一、前言二、相关术语和定义三、日志传送和复制3.1、在主数据库丢失时从辅助数据库进行复制的要求和过程3.2、使用事务复制进行日志传送3.3、使用合并复制进行日志传送 一、前言 日志传送允许您自动将事务日志备份从主服务器实例上的主数据库发送到单独辅助服务…

思维导图手撕MyBatis源码

文章目录 前置准备通过类加载器读取配置文件流创建sqlSessionFactory建造者模式的使用 打开SqlSession获取Mapper接口对象执行Mapper接口方法 前置准备 既然要读MyBatis的源码&#xff0c;那么我们就要先弄清楚MyBatis的入口在哪。这里我们直接写一个标准的MyBatis使用程序&am…

Node 【Buffer 与 Stream】

文章目录 &#x1f31f;前言&#x1f31f;Buffer&#x1f31f; Buffer结构&#x1f31f; 什么时候用Buffer&#x1f31f; Buffer的转换&#x1f31f; Buffer使用&#x1f31f; 创建Buffer&#x1f31f; 字符串转Buffer&#x1f31f; Buffer转字符串&#x1f31f; 拼接Buffer&am…

微信小程序登录注册页面

// login.js // 获取应用实例 var app getApp() var api require("../../utils/api.js")Page({data: {motto: zhenbei V1.0.0,userInfo: {},hasUserInfo: false,disabled: true,btnstate: default,username: ,password: ,canIUse: wx.canIUse(button.open-type.get…

UE4/5 C++网络服务器编程纪录【零】--准备篇

前言 之前利用业余时间重新复习UE4/5的C开发&#xff0c;闲来无事做了个基于独立服务器的多人在线&#xff08;目前限定客户数量是20人以内&#xff09;DEMO&#xff0c;核心功能在我之前发的B站视频里面有&#xff0c;战斗、动作、交互以及场景演示都有了&#xff0c;有朋友看…

Linux使用:环境变量指南和CPU和GPU利用情况查看

Linux使用&#xff1a;环境变量指南和CPU和GPU利用情况查看 Linux环境变量初始化与对应文件的生效顺序Linux的变量种类设置环境变量直接运行export命令定义变量修改系统环境变量修改用户环境变量修改环境变量配置文件 环境配置文件的区别profile、 bashrc、.bash_profile、 .ba…

函数(有点难,要注重实战)

目录 1. 函数是什么2. C语言中函数的分类2.1 库函数2.1.1 如何学会使用库函数&#xff1f; 2.2 自定义函数 3. 函数的参数3.1 实际参数&#xff08;实参&#xff09;&#xff1a;3.2 形式参数&#xff08;形参&#xff09;&#xff1a; 4. 函数的调用&#xff1a;4.1 传值调用4…

Spark SQL实战(08)-整合Hive

1 整合原理及使用 Apache Spark 是一个快速、可扩展的分布式计算引擎&#xff0c;而 Hive 则是一个数据仓库工具&#xff0c;它提供了数据存储和查询功能。在 Spark 中使用 Hive 可以提高数据处理和查询的效率。 场景 历史原因积累下来的&#xff0c;很多数据原先是采用Hive…

Node内置模块 【url模块与queryString】

文章目录 &#x1f31f;前言&#x1f31f;url 模块&#x1f31f; URL各部分说明&#x1f31f; 将URL字符串转换为对象&#x1f31f; 将对象格式化为URL字符串&#xff1a;url.format(urlObj)&#x1f31f; URL路径处理&#xff1a;url.resolve(from, to) &#x1f31f; querySt…

MySQL-四大类日志

目录 &#x1f341;MySQL日志分为4大类 &#x1f341;错误日志 &#x1f343;修改系统配置 &#x1f341;二进制日志 &#x1f343;查看二进制日志 &#x1f343;删除二进制日志 &#x1f343;暂时停止二进制日志的功能 &#x1f341;事务日志(或称redo日志) &#x1f341;慢查…