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.hqwc.cn/news/286980.html

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

相关文章

七:爬虫-数据解析之正则表达式

七:正则表达式概述 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母&#xf…

C++刷题 -- KMP算法

C刷题 – KMP算法 文章目录 C刷题 -- KMP算法1.算法讲解2.算法实现 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 1.算法讲解 KMP算法是一种字符串匹配算法,当出现字符串不匹配时,可以记录一部分之…

求奇数的和 C语言xdoj147

题目描述:计算给定一组整数中奇数的和,直到遇到0时结束。 输入格式:共一行,输入一组整数,以空格分隔 输出格式:输出一个整数 示例: 输入:1 2 3 4 5 0 6 7 输出:9 #inclu…

线上环境如何正确配置 Django 的 DEBUG?

Author:rab Django Version:3.2 Python Version:3.9 目录 前言一、DEBUG True二、DEBUG False三、页面异常解决总结 前言 由于最近在学习 Django 的知识,于是尝试开发了一套 Blog 系统,在本地测试时是页面显示没问题…

Ubuntu安装ARM交叉编译器

Ubuntu安装交叉编译器 更新apt # 更新apt sudo apt update安装gcc sudo apt install build-essential查看gcc版本 gcc -v下载交叉编译工具 复制到用户目录 解压 tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz移动到/opt/下 sudo ./gcc-linaro-5.…

Java项目-瑞吉外卖项目优化Day1

创建新仓库 push项目 新建分支v1.0做优化 导入Redis相关配置 导入坐标。 实现配置类,重写序列化器,也可以直接用StringRedisTemplate。 application.xml配置: 实现缓存短信验证码 将手机号与验证码存进redis。 从redis中获取验证码&…

JMESPath语言

JMESPath(JSON Matching Expression Path) 一种查询语言。 主要用于从JSON文档中检索和过滤数据。 通过写表达式提取和处理JSON数据,而无需编写复杂的代码。 功能:数据提取、过滤、转换、排序。 场景:处理API响应…

手撕分布式缓存---HTTP Client搭建

经过上个章节的学习,我们已经实现了一致性哈希算法,这个算法保证我们可以在节点发生变动时,最少的key请求受到影响,并返回这个节点的名称;这很大程度上避免了哈希雪崩和哈希穿透的问题。这个章节我们要基于此实现完整的…

docker小白第六天

docker小白第六天 容器数据卷是什么 首先,容器卷有个坑:容器卷需要加入privilegedtrue,如下图所示,是为了解决permission denied的问题。其中“挂载”的意思是相当于一个硬盘插到主机上。使用该命令。是扩大容器的权限解决挂载目…

PyQt6 QSpacerItem弹簧控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

二维码搭建意见建议反馈留言系统

传统纸质投诉建议需要用笔进行填写,反馈意见费时费力,相关单位收到留言反馈意见后也无法进行直接进行回复。 将投诉建议的记录单制作成二维码,放在公告栏等位置,用户可以扫描二维码随时随地进行反馈,常见的有评价表、投诉建议表、反馈意见表、留言表等,也就是通过扫码实现对用…

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力 前言:主要领域:人工智能:使用 OpenVINO™ 落地边缘端生成式 AIOpenVINO™学习总结: 新一代 AI PC计算平台:新一代至强平台:边云协同:先进技术&#xff…