Gin之GORM的表关联查询操作详解

前期工作:

先查看下要操作的两张表:

carton

carton_cate 

//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)

1、创建路由(cartonRoutes)

package routersimport ("gindemo04/controllers/admin""github.com/gin-gonic/gin"
)func CartonController(r *gin.Engine) {cartonRouters := r.Group("/carton"){cartonRouters.GET("/test", admin.CartonController{}.Test)}
}

2、控制文件创建(cartonController.go)

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}func (con CartonController) Test(c *gin.Context) {}

3、入口文件绑定(main.go)

4、固定要操作的表

/models/carton:

package models
//carton可以查询卡通章节,获取章节对应的分类要在cartoncate
type Carton struct { //这样默认操作的是cartons表Id intTitle stringCartonCateId int  //1、cartonCateId默认为外键(在建立关系后,默认以主表+id作为外键)Status int}//固定要操作的表名
func (Carton) TableName() string {return "carton"
}

Belongs To | GORM - The fantastic ORM library for Golang, aims to be developer friendly.icon-default.png?t=N7T8https://gorm.io/zh_CN/docs/belongs_to.html

/models/carton_cate:

//foreignKey外键 如果是表名称加上Id默认也可以不配置,如果不是需要使用`gorm:"foreignKey:+你的外键名称配置
//references表示的是主键 默认就是Id 如果是Id的话可以不配置

package models//CartonCate查询分类,获取卡通分类下的章节type CartonCate struct { //这样默认操作的是articles表Id int  //默认为主键Title stringStatus int}//固定要操作的表名
func (CartonCate) TableName() string {return "carton_cate"
}

开始操作:

1、获取所有的动漫章节

cartonController.go:

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}
//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)
func (con CartonController) Test(c *gin.Context) {
//1、获取所有章节cartonList := []models.Carton{}models.DB.Find(&cartonList)c.JSON(http.StatusOK, gin.H{"List": cartonList,})}

2、获取角色对应的动漫分类

/models/carton:

package models
//carton可以查询卡通章节,获取章节对应的分类要在cartoncate
type Carton struct { //这样默认操作的是cartons表Id intTitle stringCartonCateId int  //1、cartonCateId默认为外键(在建立关系后,默认以主表+id作为外键)Status intCartonCate CartonCate }//固定要操作的表名
func (Carton) TableName() string {return "carton"
}

cartonController.go:

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}
//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)
func (con CartonController) Test(c *gin.Context) {
//1、获取所有章节// cartonList := []models.Carton{}// models.DB.Find(&cartonList)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList,// })//2、获取角色对应的动漫分类cartonList1 := []models.Carton{}//preload是用来加载另外一张表的,这里的cartoncate是在carton.go内配置的models.DB.Preload("CartonCate").Find(&cartonList1)c.JSON(http.StatusOK, gin.H{"List": cartonList1,})
}

这里需要注意:你preload内的是需要和你在外部caton结构体是一致的,大小写,不然找不到

3、重写外键的操作

Belongs To | GORM - The fantastic ORM library for Golang, aims to be developer friendly.icon-default.png?t=N7T8https://gorm.io/zh_CN/docs/belongs_to.html

caton有默认的主键为ID,但是catoncate没有了对应的caton_cate_id做外键了(这里成为了cate_id),需要操作修改一下

/models/caton.go:

package models
//carton可以查询卡通章节,获取章节对应的分类要在cartoncate
type Carton struct { //这样默认操作的是cartons表Id intTitle stringCateId int  //1、cartonCateId默认为外键(在建立关系后,默认以主表+id作为外键)Status intCartonCate CartonCate `gorm:"foreignKey:CateId;references:Id"` // 2、没有1的情况下如何处理(重写外键)}//固定要操作的表名
func (Carton) TableName() string {return "carton"
}

 cartonController.go:

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}
//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)
func (con CartonController) Test(c *gin.Context) {
//1、获取所有章节// cartonList := []models.Carton{}// models.DB.Find(&cartonList)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList,// })//2、获取角色对应的动漫分类cartonList1 := []models.Carton{}//preload是用来加载另外一张表的,这里的cartoncate是在carton.go内配置的models.DB.Preload("CartonCate").Find(&cartonList1)c.JSON(http.StatusOK, gin.H{"List": cartonList1,})
}

 

4、依据动漫分类看其所属章节

4.1、先获取章节对应动漫的分类

 cartonController.go:

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}
//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)
func (con CartonController) Test(c *gin.Context) {
//1、获取所有章节// cartonList := []models.Carton{}// models.DB.Find(&cartonList)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList,// })//2、获取角色对应的动漫分类// cartonList1 := []models.Carton{}// //preload是用来加载另外一张表的,这里的articlecate是在article.go内配置的// models.DB.Preload("CartonCate").Find(&cartonList1)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList1,// })//4、依据分类看分类下文章//4.1、先获取caton的分类cartonList2 := []models.Carton{}models.DB.Preload("CartonCate").Find(&cartonList2)c.JSON(http.StatusOK, gin.H{"List": 	cartonList2,})
}

根据这里的cateid可以获取对应动漫

4.2、依据分类看分类下章节

caton.go

package models
//carton可以查询卡通章节,获取章节对应的分类要在cartoncate
type Carton struct { //这样默认操作的是cartons表Id intTitle stringCateId int  //1、cartonCateId默认为外键(在建立关系后,默认以主表+id作为外键)Status intCartonCate CartonCate `gorm:"foreignKey:CateId;references:Id"` // 2、没有1的情况下如何处理(重写外键)}//固定要操作的表名
func (Carton) TableName() string {return "carton"
}

catonCate.go 

package models//CartonCate查询分类,获取卡通分类下的章节
//foreignKey外键 如果是表名称加上Id默认也可以不配置,如果不是需要使用`gorm:"foreignKey:+你的外键名称配置
//references表示的是主键 默认就是Id 如果是Id的话可以不配置type CartonCate struct { //这样默认操作的是articles表Id int  //默认为主键 ()Title stringStatus intCarton []Carton  `gorm:"foreignKey:CateId;references:Id"`
}//固定要操作的表名
func (CartonCate) TableName() string {return "carton_cate"
}

 cartonController.go:

package adminimport ("gindemo04/models""net/http""github.com/gin-gonic/gin"
)type CartonController struct {BaseController
}
//关系如下:
// 一个章节对应一个动漫(一对一;两种方法:belong to;has one)
// 一个动漫可以对应多个章节(一对多)
func (con CartonController) Test(c *gin.Context) {
//1、获取所有章节// cartonList := []models.Carton{}// models.DB.Find(&cartonList)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList,// })//2、获取角色对应的动漫分类// cartonList1 := []models.Carton{}// //preload是用来加载另外一张表的,这里的articlecate是在article.go内配置的// models.DB.Preload("CartonCate").Find(&cartonList1)// c.JSON(http.StatusOK, gin.H{// 	"List": cartonList1,// })//4、依据分类看分类下文章//4.1、先获取caton的分类// cartonList2 := []models.Carton{}// models.DB.Preload("CartonCate").Find(&cartonList2)// c.JSON(http.StatusOK, gin.H{// 	"List": 	cartonList2,// })//4.2、has many 一对多cartonList3 := []models.CartonCate{}models.DB.Preload("Carton").Find(&cartonList3)c.JSON(http.StatusOK, gin.H{"List": 	cartonList3,})}

 

 

//操作完成后看到一个空的cartoncate,去到carton.go将其注释掉 

注释后的 carton.go

package models
//carton可以查询卡通章节,获取章节对应的分类要在cartoncate
type Carton struct { //这样默认操作的是cartons表Id intTitle stringCateId int  //1、cartonCateId默认为外键(在建立关系后,默认以主表+id作为外键)Status int// CartonCate CartonCate `gorm:"foreignKey:CateId;references:Id"` // 2、没有1的情况下如何处理(重写外键)}//固定要操作的表名
func (Carton) TableName() string {return "carton"
}

再次查看:

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

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

相关文章

Eclipse_01_如何设置代码文件背景颜色为护眼沙绿色

设置方法 Window --> Preference 参考文档 参考文档 1

uni-app ucharts中饼图与圆环图区别

项目情况: uni-app的用于移动端H5项目,包使用uni_modules目录存放。 图表引用ucharts中的echarts配置的组件方式 区别1 饼图与圆环图在echarts使用的配置都是pie类型。但是配置raduis使用: radius: [40%, 70%] 区别2 组件type指明&#xf…

Linux 非阻塞网络IO模式

非阻塞网络IO模式介绍 当用户线程发起一个 read 操作后,并不需要等待,而是马上就得到了一个结果。如果结果是一个 error 时,它就知道数据还没有准备好,于是它可以再次发送 read 操作。一旦内核中的数据准备好了,并且又…

修复泰坦陨落2缺少msvcr120.dll的5种方法,亲测有效

游戏《泰坦陨落2》缺少msvcr120.dll的问题困扰着许多玩家。这个问题的主要原因可能是系统环境不完整、软件或游戏版本不匹配、DLL文件丢失或损坏以及杀毒软件误判等。msvcr120.dll是Microsoft Visual C 2013 Redistributable的一个组件,它包含了许多运行库文件&…

【百度PARL】强化学习笔记

文章目录 强化学习基本知识一些框架Value-based的方法Q表格举个例子 强化的概念TD更新 Sarsa算法SampleSarsa Agent类 On_policy vs off_policy函数逼近与神经网络DQN算法DQN创新点DQN代码实现model.pyalgorithm.pyagent.py总结:举个例子 实战 视频:世界…

苏宁开放平台API接口全攻略:掌握电商数据,提升业务效率

一、概述 苏宁平台提供了丰富的API接口,用于开发人员与平台进行交互,实现各种功能。本文将介绍苏宁平台API接口的基本概念、使用方法和注意事项,帮助开发人员更好地利用这些接口,提高开发效率和质量。 二、API接口介绍 商品详情…

html之CSS的高级选择器应用

文章目录 一、CSS高级选择器有哪些呢?二、高级选择器的应用1、层次选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器 2、结构伪类选择器(不常用)3、属性选择器E[attr]E[attrval]E[attr^val]E[attr$val]E[attr*val] 一、CSS高级选择器有…

excel该如何实现生成条形码/二维码?

如何在Excel中制作条形码/二维码? 1.首先,打开电脑上的Excel。进入后,在上方菜单栏中找到并点击“开发工具”。如果没有找到开发工具,就先点击“文件”,在弹出菜单中再点击“选项”。 2.打开Excel选项窗口后&#xff0…

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1)环境准备2)准备相关 jar 包3)实现场景4)准备工作4.1.Mysql4.2.Kafka 5)Flink-Sql6)验证 1)环境…

VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书

目录 前言一、依赖环境二、vuepress 安装和使用1.初始化2.将 VuePress 安装为本地依赖3. package.json 中添加脚本4. 新建 docs 文件夹5.启动6. 效果 三、进阶使用1.新增配置文件2.安装搜索插件3.config.js 中增加配置4.效果展示5.注意 四、使用主题1.安装2. 目录结构说明&…

Hadoop3.x完全分布式模式下slaveDataNode节点未启动调整

目录 前言 一、问题重现 1、查询Hadoop版本 2、集群启动Hadoop 二、问题分析 三、Hadoop3.x的集群配置 1、停止Hadoop服务 2、配置workers 3、从节点检测 4、WebUI监控 总结 前言 在大数据的世界里,Hadoop绝对是一个值得学习的框架。关于Hadoop的知识&…

git修改远程commit信息

git 修改远程commit信息 如果你已经把本地commit的信息push到远程了,此时需要修改远程中的commit信息 第一步:git log 查看提交的信息,看下提交的commit日志 如下入所示 第二步:然后确定你需要修改的那一次commit,比如&#xf…

简单的绑定发布事件

在绑定事情之前,我们需要对我们的需求进行分析;判断我们是否需要同时存在条件。 发布动态的时候,分为以下三种情况: ① 输入了标题,没有图片,可以发布动态 ②输入了图片,没有标题,…

清空缓存区的方法

fflush(文件指针) fflush()用于刷新相应文件的缓存区。 使用getchar()函数来清空标准输入缓存区 上面的fflush是一个函数,有些编译器不一定支持,这时候我们可以自己实现清空标准输入缓存区的操作。 代码示例: 使用scanf()的高级特性来清空标准输入缓存区 上面代码的意思是: …

GO 的 socks5代理 编写

这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只…

LLMs推理框架总结

总结一下这些框架的特点,如下表所示: LLM推理有很多框架,各有其特点,下面分别介绍一下表中七个框架的关键点: vLLM:适用于大批量Prompt输入,并对推理速度要求高的场景;Text generat…

C语言-> 文件操作(函数满屏)

系列文章目录 前言 ✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉 🍎个人主页:橘橙黄又青_C语言,数据结构,函数-CSDN博客 目的:学习文件操作,即…

林杰:程序员依然是草根跨越阶级的最佳途径之一 | 程客有话说

《程客有话说》是我们最新推出的一个访谈栏目,邀请一些国内外有趣的程序员来分享他们的经验、观点与成长故事,尝试建立一个程序员交流与学习的平台,也欢迎大家推荐朋友或自己来参加我们的节目,一起加油。 本期我们邀请的程序员林…

2023-12-19 二叉搜索树的最小绝对差和二叉搜索树的众数和二叉树的最近公共祖先

二叉搜索树的最小绝对差 关键信息:二叉搜索树表明了树有序的!遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值 # Definition for a binary tree node. # class TreeNode: # …

微信私域管理工具如何帮助企业提升销售业绩?

现如今,微信已经从社交通讯软件,慢慢被默认为常规办公软件,工作沟通、业务洽谈、网络会议等都在微信上进行,完全变成职场首选的社交工具。 但受限于微信平台,许多公司在微信私域营销方面面临诸多挑战。 微信私域管理工…