Gin之GORM多表关联查询(多对多;自定义预加载SQL)

 数据库三个,如下:

注意:配置中间表的时候,表设计层面最好和配置的其他两张表契合,例如其他两张表为fate内的master和slave;要整合其对应关系的话,设计中间表的结构为master_id和slave_id最好(不然会涉及重写外键的操作)

重写外键(介绍)

对于 many2many 关系,连接表会同时拥有两个模型的外键,例如:

type User struct {gorm.ModelLanguages []Language `gorm:"many2many:user_languages;"`
}type Language struct {gorm.ModelName string
}// 连接表:user_languages
//   foreign key: user_id, reference: users.id
//   foreign key: language_id, reference: languages.id

若要重写它们,可以使用标签 foreignKeyreferencesjoinforeignKeyjoinReferences。当然,您不需要使用全部的标签,你可以仅使用其中的一个重写部分的外键、引用。

type User struct {gorm.ModelProfiles []Profile `gorm:"many2many:user_profiles;foreignKey:Refer;joinForeignKey:UserReferID;References:UserRefer;joinReferences:ProfileRefer"`Refer    uint      `gorm:"index:,unique"`
}type Profile struct {gorm.ModelName      stringUserRefer uint `gorm:"index:,unique"`
}// 会创建连接表:user_profiles
//   foreign key: user_refer_id, reference: users.refer
//   foreign key: profile_refer, reference: profiles.user_refer

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

前期准备工作:

1、创建要操作表的models:

/models/lesson.go:

package modelstype Lesson struct {Id      int       `json:"id"`Name    string    `json:"name"`}func (Lesson) TableName() string {return "lesson"
}

/models/student.go:

package modelstype Student struct {Id       intNumber   stringPassword stringClassId  intName     string}func (Student) TableName() string {return "student"
}

/models/lessonStudent.go:

package modelstype LessonStudent struct {LessonId  int `json:"lesson_id"`StudentId int `json:"student_id"`
}func (LessonStudent) TableName() string {return "lesson_student"
}

2、路由创建:

package routersimport ("gindemo04/controllers/admin""gindemo04/middle""github.com/gin-gonic/gin"
)func AdminRoutersInit(r *gin.Engine) {//middlewares.InitMiddleware中间件adminRouters := r.Group("/admin", middle.InitMiddleware){adminRouters.GET("/student", admin.StudentController{}.Index)}
}

3、控制器创建:

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

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

相关文章

HP服务器idrac设置以及系统安装

HP服务器idrac设置以及系统安装 一、设置管理口的地址和密码1、HP服务器重新界面选择"F9"进入BIOS,设置iLo5(idrac)的IP和用户名密码。2、选择"系统配置"。3、选择"iLO 4"配置程序。4、网络选项是设置idrac管理口的地址,设…

matplotlib科研绘图之折线图、柱状图、散点图、误差棒

matplotlib折线图例子1 # -*- coding: utf-8 -*- # Time : 2023/12/19 10:56 # Author : 长沙有肥鱼 # FileName: 21.py # Software: PyCharm # Blog : https://blog.csdn.net/weixin_53660567?spm1010.2135.3001.5343# 导入Matplotlib库 import matplotlib import ma…

中低压MOS 适用于电子烟等产品—— 较小的开关损耗 过流能力好

工作原理: 当用户在吸嘴处抽吸时,气流经过进气孔,穿 过电路板上方的咪头,咪头即产生电信号,驱 动芯片板,让电池供电给雾化芯,雾化芯中的 发热丝将电能转化成热能,当温度达到…

github订阅充值

一、前言 GitHub是全球最大的面向开源及私有软件项目托管平台之一。它提供了一个基于Git的托管服务,使得用户可以轻松地在互联网上存储、共享和管理其代码仓库。 二、GitHub的主要特点 开放性和协作性:GitHub是面向开发者和开源社区的,其平…

ios微信小程序table头部与左侧固定双重滚动会抖动的坑,解决思路

正常情况是左右滑动时,左侧固定不动,上下滑动时表头不动;而且需求不是完整页面滚动。而是单独这个表滚动; 第一个坑是他有一个ios自带的橡胶上下回弹效果。导致滚动时整个表都跟着回弹; 这个是很好解决。微信开发官网…

浏览器原理篇—渲染原理

目录导航 为什么要学习浏览器的渲染原理浏览器的渲染流程浏览器的渲染阻塞浏览器的渲染优化 为什么要学习浏览器的渲染原理? 知识深度挖掘: 帮助更好地理解前端性能优化。从而对实现效果进行针对性优化。如:**回流和重绘 **渲染机制。帮助…

公共字段自动填充——后端

场景:当处理一些请求时,会重复的对数据库的某些字段进行赋值(如:在插入和更新某个物品时,需要更新该物品的更新时间和更新者的信息),这样会导致代码冗余。 如: 思路: 自…

得物-Golang-记一次线上服务的内存泄露排查

1.出现内存泄漏 1.1 事发现场 在风和日丽的一天,本人正看着需求、敲着代码,展望美好的未来。突然收到一条内存使用率过高的告警。 1.2 证人证词 告警的这个项目,老代码是python的,最近一直在go化。随着go化率不断上升&#xff…

phpmyadmin4.8.1远程文件包含漏洞 [GWCTF 2019]我有一个数据库1

打开题目 我们用dirsearch扫描一下后台看看 扫描结果如下 我们访问一下robots.txt看看,提示有phpinfo.php 那我们访问一下phpinfo.php 发现没有任何信息后我们转去看看phpmyadmin看看 成功访问到页面 在这里我们看到phpmyadmin的版本号是4.8.1 我们百度搜索一下看…

备受好评的几个视频素材网站,后期剪辑必看~

现在市面上大大小小的视频素材网站一搜一大把,但是真正能够称得上宝藏实用的却寥寥无几,做过后期的下伙伴们都知道素材站的重要性,一些周期短需要赶时间的项目,根本来不及去实拍,这个时候一个好的素材站真的算得上是救…

自动化测试入门 —— 自动化测试概论

整篇论述总的来讲会很长,从自动化的思维、模型、工具,到各层次的自动化测试技术、测试框架、测试平台,包括面向未来的自动化技术都将涉及,因此打算拆成几个部分去写。此外,由于涉及的范围比较广泛,部分内容…

opencv入门到精通——OpenCV中的绘图功能

目录 目标 代码 画线 画矩形 画圆圈 画椭圆 画多边形 向图像添加文本: 结果 目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.pu…