首页 > 其他分享 >GOrm多对多(关联查询)

GOrm多对多(关联查询)

时间:2024-01-16 14:00:12浏览次数:37  
标签:string gorm Video 关联 json video int64 查询 GOrm

一、概述

  现有两张表,一张表代表章节(chapter)、另外一张表代表集(episode)。一个章节中包含多集,一个集中有可能有视频也有可能没有视频,视频表(video)。

  表结构如下:

  1.章节表(chapter),ps:一个章节中包含了多集

  2.集表(episode),集中有视频

  3.视频表(video)

 

  要求:查询章节列表,并把章节中的所有集加载出来,并且把集中的视频也加载出来。效果如下:

  

  如果想要查询出来的表中的字段自动映射就需要用到gorm的Preload。

 

 

二、代码示例

  1.章节结构体(Chapter)

package entity

// "gorm.io/gorm"

// 章节结构体
type Chapter struct {
    // gorm.Model
    Id         int64     `json:"id"`
    VideoId    string    `json:"video_id"`
    Title      string    `json:"title"`
    Ordered    int       `json:"ordered"`
    CreateTime string    `json:"create_time"`
    UpdateTime string    `json:"update_time"`
    Sort       int       `json:"sort"`
    CreateUser int64     `json:"create_user"`
    UpdateUser int64     `json:"update_user"`
    Deleted    int       `json:"deleted"`
    Episodes   []Episode `json:"episodes" gorm:"foreignKey:ChapterId;"` // 其中foreignKey:ChapterId代表设置Episode结构体的ChapterId和chapter结构体的Id是关联关系(主外键关系)
    Video      Video     `json:"video" gorm:"foreignKey:VideoId;"`//其中foreignKey:VideoId代表设置video表的id和chapter表的VideoId字段是关联关系(主外键)关系
}

func (Chapter) TableName() string {//设置结构体对应的表名为:chapter
    return "chapter"
}

  2.集结构体(Episode)

package entity

// foreignKey    指定当前模型的列作为连接表的外键
// references    指定引用表的列名,其将被映射为连接表外键
// polymorphic    指定多态类型,比如模型名
// polymorphicValue    指定多态值、默认表名
// many2many    指定连接表表名
// joinForeignKey    指定连接表的外键列名,其将被映射到当前表
// joinReferences    指定连接表的外键列名,其将被映射到引用表
// constraint    关系约束,例如:OnUpdate、OnDelete

// "gorm.io/gorm"

// 集(集中包含章节)
type Episode struct {
    // gorm.Model
    Id         int64  `json:"id"`
    Title      string `json:"title"`
    Num        int    `json:"num"`
    Ordered    int    `json:"ordered"`
    PlayUrl    string `json:"play_url"`
    ChapterId  int64  `json:"chapter_id"`
    Free       int    `json:"free"`
    VideoId    int64  `json:"video_id"`
    CreateTime string `json:"create_time"`
    UpdateTime string `json:"update_time"`
    Sort       int    `json:"sort"`
    CreateUser int64  `json:"create_user"`
    UpdateUser int64  `json:"update_user"`
    Deleted    int    `json:"deleted"`
    Video      Video  `json:"video" gorm:"foreignKey:VideoId;"`//其中foreignKey:VideoId代表,设置video表的id和episode表的VideoId是关联关系(主外键关系),只有关联正确后才能够执行预加载
}

func (Episode) TableName() string {//代表Episode结构体对应的表名是episode
    return "episode"
}

  3.视频结构体(Video)

package entity

type Video struct {
    Id         int64   `json:"id"`
    Title      string  `json:"title"`
    Summary    string  `json:"summary"`
    CoverImg   string  `json:"cover_img"`
    Price      int64   `json:"price"`
    CreateTime string  `json:"create_time"`
    Point      float64 `json:"point"`
    UpdateTime string  `json:"update_time"`
    CreateUser int64   `json:"create_user"`
    UpdateUser int64   `json:"update_user"`
    Deleted    int64   `json:"deleted"`
}

func (Video) TableName() string {//代表Video结构体对应的数据库表名是video
    return "video"
}

  4.执行多表联查

func getECsHandler(context *gin.Context) {
    db := connectMySql().Debug()
  //定义一个章节列表切片,用于存储查询出来的章节列表 var chapters []entity.Chapter
  //Preload("Episodes")代表预加载episode表,其中Episodes代表Chapter结构体中定义的字段
  //Preload("video")代表预加载video表,其中Video代表Chapter或者Episodes结构体中定义的字段
  //然后把预加载出来的数据组合到chapters切片中 err := db.Preload("Episodes").Preload("Video").Find(&chapters).Error if err != nil { response.ShowError(400, "多表联查查询失败", context) return } response.ShowSuccess(chapters, context) }

  5.上面的db.Preload("Episodes").Preload("Video").Find(&chapters).Error执行的sql如下

SELECT * FROM `episode` WHERE `episode`.`chapter_id` IN (370,371,372,373,374,375,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,450,451,452,453,454,455,456,457,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,510,511,512,513,514,515,516,517,518,519,520,521,522,523,600,601,602,603,604,605,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726)
SELECT * FROM `video` WHERE `video`.`id` IN ('40','41','42','43','44','45','46','47','31','48')
SELECT * FROM `chapter`

 

标签:string,gorm,Video,关联,json,video,int64,查询,GOrm
From: https://www.cnblogs.com/tony-yang-flutter/p/17967524

相关文章

  • Go+Gin+GOrm+MySql实现基础的增删改查
    一、概述本节使用Gin+GOrm+MySql实现基础的增删改查。主要是做一下记录防止后面忘记了可以翻看博客查看主要有两个.go文件1.main.go用于注册gin路由及初始化gorm操作数据库2.Result.go用于封装服务端返回给客户端的响应体二、代码示例1.main.go//go_......
  • [FAQ] Docker查询出所有的停止容器并移除
     $ dockerrm`dockercontainerls-a--filter"status=exited"|awk'{print$1}'|sed'1,1d'|xargs` Ref:phvia/dkcRef:[Shell]字符截取命令:cut,printf,awk,sedRef:使用nodejs的puppeteer库使用完关闭后,linux上面有很多chrome进程Link:https......
  • Java 将所有的数据信息查询出来 ,进行映射
    查询出所有组织结构的数据,列表显示时进行映射 该代码查询的参数是逗号相隔的多个数据//查询对应组织机构List<Map<String,Object>>deptList=businessManagerMapper.querySysDept();Map<Object,List<Map<String,Object>>>groupMap=deptList.stream().co......
  • sqlserver查询最近失败的任务
    selectjob_id,step_name,message,cast((cast(LEFT(run_date,4)ASVARCHAR)+'-'+SUBSTRING(cast(run_dateASVARCHAR),5,2)+'-'+cast(RIGHT(run_date,2)ASVARCHAR))+'......
  • map根据次数排序,同时取最后一次查询到的附件数据
    1、需求是某某供应商可以参与投标多轮;现要求存在多轮报价取最后一次的报价文件;不存在则取第一次的报价;(第一次的投标逻辑与之后的逻辑不一样,存在不同的表里)2、Hashmap是无序的;treeMap是有序的即:Map<String,Object>map=newTreeMap<String,Object>(Collections.reverseOrder(......
  • R语言关联规则模型(Apriori算法)挖掘杂货店的交易数据与交互可视化
    原文链接:http://tecdat.cn/?p=22732 原文出处:拓端数据部落公众号 关联规则挖掘是一种无监督的学习方法,从交易数据中挖掘规则。它有助于找出数据集中的关系和一起出现的项目。在这篇文章中,我将解释如何在R中提取关联规则。关联规则模型适用于交易数据。交易数据的一个例子可以......
  • 数据库查询如何优化?
    索引优化:索引可以加速查询速度,但是索引的使用也会带来一些开销。因此,需要根据查询的情况对索引进行优化,比如对经常使用的字段进行索引,或者使用覆盖索引等。数据库设计优化:数据库的设计也会影响查询的性能。比如对于经常需要联表查询的情况,可以将需要联表的字段放在同一张表中,或......
  • openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低
    openGauss学习笔记-198openGauss数据库运维-常见故障定位案例-分析查询效率异常降低的问题198.1分析查询效率异常降低的问题198.1.1问题现象通常在几十毫秒内完成的查询,有时会突然需要几秒的时间完成;而通常需要几秒完成的查询,有时需要半小时才能完成。198.1.2处理办法通......
  • C#中var关键字详解:强类型、匿名类型和LINQ查询的妙用!
     在C#中,var关键字是强类型的,因为它在编译时会根据变量的初始化表达式推断出变量的实际类型,并且一旦确定了类型,就不能再更改。这种类型推断是在编译时进行的,因此代码中的变量在运行时是具有明确定义类型的。下面是一个简单的示例,说明var的强类型特性以及使用时的一些注意事项:......
  • springboot + mybatis plus 全局添加查询字段反引号
    配置文件添加: column-format:"`%s`"mybatis-plus:#启动时是否检查MyBatisXML文件是否存在check-config-location:true#MyBatis原生配置configuration:#字段名称下划线转驼峰命名map-underscore-to-camel-case:trueglobal-config:db-co......