首页 > 其他分享 >Gorm常见映射关系查询实例

Gorm常见映射关系查询实例

时间:2024-01-16 15:57:50浏览次数:32  
标签:string 映射 create 查询 json 实例 int64 user Gorm

一、概述

  本小节主要罗列一下常见的查询以及相应的代码示例

  1.假设你有一个轮播图表,请查询出轮播图中的所有记录

  2.获取后台管理用户列表,并把用户的角色信息也查询出来

  3.查询用户订单信息,要求:查询某用户买了某商品的订单信息。本例是查询用户购买的视频的详细的订单信息(用户信息、视频信息、订单信息)

  4.查询用户播放记录,要求:查询谁播放了第几节的哪一个视频

二、代码示例

  1.假设你有一个轮播图表,请查询出轮播图中的所有记录

  a.轮播图结构体定义

type VideoBanner struct {
    Id          int64  `json:"id"`
    Url         string `json:"url"`
    Img         string `json:"img"`
    Widget      int    `json:"widget"`
    Description string `json:"description"`
    CreateTime  string `json:"create_time"`
    UpdateTime  string `json:"update_time"`
    CreateUser  int64  `json:"create_user"`
    UpdateUser  int64  `json:"update_user"`
    Deleted     int64  `json:"deleted"`
}

// 设置结构体对应的表名
func (VideoBanner) TableName() string {
    return "video_banner"
}

  b.查询轮播图列表

// 查询视频轮播图列表
func getVideoBannerListHandler(context *gin.Context) {
    db := connectMySql().Debug()
    var videoBanners []entity.VideoBanner
    //这个Select可以指定要返回的字段,没有指定的则不返回,如果不指定Select中的字段,则默认全部返回
    err := db.Select("id", "url", "img", "description").Find(&videoBanners).Error
    if err != nil {
        response.ShowError(500, "查询视频轮播图失败", context)
        return
    }
    response.ShowSuccess(videoBanners, context)
}

  c.查询结果

   2.获取后台管理用户列表,并把用户的角色信息也查询出来

   a.后台管理用户结构体和角色结构体

// 后台用户结构体
type AdminUser struct {
    Id                 int64               `json:"id"`
    Account            string              `json:"Account"`
    Password           string              `json:"password"`
    NickName           string              `json:"nick_name"`
    Role               string              `json:"role"`
    CreateTime         string              `json:"create_time"`
    UpdateTime         string              `json:"update_time"`
    CreateUser         int64               `json:"create_user"`
    UpdateUser         int64               `json:"update_user"`
    Deleted            int                 `json:"deleted"`
    AdminRoles         []AdminRole         `json:"adminRoles" gorm:"foreignKey:Role;references:Role;"`
    AdminUserLoginLogs []AdminUserLoginLog `json:"adminUserLoginLogs" gorm:"foreignKey:UserId";`
}

// foreignKey    指定当前模型的列作为连接表的外键
// references    指定引用表的列名,其将被映射为连接表外键
func (AdminUser) TableName() string {
    return "admin_user"
}

// 后台用户角色表
type AdminRole struct {
    Id              int64  `json:"id"`
    Role            string `json:"role"`
    RoleDescription string `json:"role_description"`
    CreateTime      string `json:"create_time"`
    UpdateTime      string `json:"update_time"`
    CreateUser      int64  `json:"create_user"`
    UpdateUser      int64  `json:"update_user"`
    Deleted         int    `json:"deleted"`
}

func (AdminRole) TableName() string {
    return "admin_role"
}

  b.查询后台管理用户列表并把角色也一块查询出来

// 获取后台管理用户角色
func getAdminUserRolesHandler(context *gin.Context) {
    db := connectMySql().Debug()
    var adminUsers []entity.AdminUser
    err := db.Preload("AdminRoles").Preload("AdminUserLoginLogs").Find(&adminUsers).Error
    if err != nil {
        response.ShowError(500, "查询后台用户角色失败", context)
        return
    }
    response.ShowSuccess(adminUsers, context)
}

  c.查询结果

   3.查询用户订单信息,要求:查询某用户买了某商品的订单信息。本例是查询用户购买的视频的详细的订单信息(用户信息、视频信息、订单信息)

  a.订单信息相关的结构体

// 用户实体
type User struct {
    Id         int64  `json:"id"`
    Name       string `json:"name"`
    Pwd        string `json:"pwd"`
    HeadImg    string `json:"head_img"`
    Phone      string `json:"phone"`
    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"`
}

// 设置结构体对应的表名
func (User) TableName() string {
    return "user"
}

type VideoOrder struct {
    Id         int64  `json:"id"`
    OutTradeNo string `json:"out_trade_no"`
    State      int    `json:"state"`
    TotalFee   int64  `json:"total_fee"`
    VideoId    int64  `json:"video_id"`
    VideoTitle string `json:"videoTitle"`
    VideoImg   string `json:"videoImg"`
    UserId     int64  `json:"user_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;"`
    User       User   `json:"user" gorm:"foreignKey:UserId;"`
}

func (VideoOrder) TableName() string {
    return "video_order"
}

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 {
    return "video"
}

  b.查询订单列表

// 查询视频订单(某用户买了某视频的详情信息)
func getVideoOrderListHandler(context *gin.Context) {
    db := connectMySql().Debug()
    var orders []entity.VideoOrder
    err := db.Preload("Video").Preload("User").Find(&orders).Error
    if err != nil {
        response.ShowError(500, "查询订单列表异常", context)
        return
    }
    response.ShowSuccess(orders, context)
}

  c.查询结果

 

   4.查询用户播放记录,要求:查询谁播放了第几节的哪一个视频

  a.查询播放记录相关的结构体

// 视频播放记录结构体
type PlayRecord struct {
    Id         int64   `json:"id"`
    UserId     int64   `json:"userId"`
    VideoId    int64   `json:"videoId"`
    EpisodeId  int64   `json:"episodeId"`
    CurrentNum int     `json:"current_num"`
    CreateTime string  `json:"create_time"`
    UpdateTime string  `json:"update_time"`
    CreateUser int64   `json:"create_user"`
    UpdateUser int64   `json:"update_user"`
    Deleted    int64   `json:"deleted"`
    User       User    `json:"user" gorm:"foreignKey:UserId;"`
    Video      Video   `json:"video" gorm:"foreignKey:VideoId;"`
    Episode    Episode `json:"episode" gorm:"foreignKey:EpisodeId;"`
}
// 设置结构体对应的表名
func (PlayRecord) TableName() string {
    return "play_record"
}

// 用户实体
type User struct {
    Id         int64  `json:"id"`
    Name       string `json:"name"`
    Pwd        string `json:"pwd"`
    HeadImg    string `json:"head_img"`
    Phone      string `json:"phone"`
    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"`
}
// 设置结构体对应的表名
func (User) TableName() string {
    return "user"
}


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 {
    return "video"
}
// 集(集中包含章节)
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;"`
}

func (Episode) TableName() string {
    return "episode"
}

  b.查询播放记录

// 查询视频播放记录(查询:谁播放了视频、播放了哪个章节的哪个视频)
func getPlayRecordListHandler(context *gin.Context) {
    db := connectMySql().Debug()
    var playRecords []entity.PlayRecord
    err := db.Preload("User").Preload("Video").Preload("Episode").Find(&playRecords).Error
    if err != nil {
        response.ShowError(500, "查询播放记录失败", context)
        return
    }
    response.ShowSuccess(playRecords, context)
}

  c.查询结果

 

标签:string,映射,create,查询,json,实例,int64,user,Gorm
From: https://www.cnblogs.com/tony-yang-flutter/p/17967842

相关文章

  • 《全局实例篇》Vue.compont注册全局组件
    注册一个全局组件语法格式如下:Vue.component(tagName,options)tagName为组件名,options为配置选项。注册后,我们可以使用以下方式来调用组件:<tagName></tagName>全局组件所有实例都能用全局组件。<divid="app"> <runoob></runoob></div><script>//注册Vue.compon......
  • GOrm多对多(关联查询)
    一、概述现有两张表,一张表代表章节(chapter)、另外一张表代表集(episode)。一个章节中包含多集,一个集中有可能有视频也有可能没有视频,视频表(video)。表结构如下:1.章节表(chapter),ps:一个章节中包含了多集2.集表(episode),集中有视频3.视频表(video) 要求:查......
  • Go+Gin+GOrm+MySql实现基础的增删改查
    一、概述本节使用Gin+GOrm+MySql实现基础的增删改查。主要是做一下记录防止后面忘记了可以翻看博客查看主要有两个.go文件1.main.go用于注册gin路由及初始化gorm操作数据库2.Result.go用于封装服务端返回给客户端的响应体二、代码示例1.main.go//go_......
  • Java 将所有的数据信息查询出来 ,进行映射
    查询出所有组织结构的数据,列表显示时进行映射 该代码查询的参数是逗号相隔的多个数据//查询对应组织机构List<Map<String,Object>>deptList=businessManagerMapper.querySysDept();Map<Object,List<Map<String,Object>>>groupMap=deptList.stream().co......
  • 41. 干货系列从零用Rust编写负载均衡及代理,websocket与tcp的映射,WS与TCP互转
    wmproxywmproxy已用Rust实现http/https代理,socks5代理,反向代理,静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子项目地址国内:https://gitee.com/tickbh/wmproxygithub:https://github.com/......
  • 【eBPF-04】进阶:BCC 框架中 BPF 映射的应用 v2.0——尾调用
    这两天有空,继续更新一篇有关eBPFBCC框架尾调用的内容。eBPF技术很新,能够参考的中文资料很少,而对于BCC框架而言,优秀的中文介绍和教程更是凤毛麟角。我尝试去网上检索有关尾调用的中文资料,BCC框架的几乎没有。即使找到了,这些资料也难以给出可供参考和正确运行的例子。BCC......
  • windows映射网络驱动器,如何更换用户名?
    由于我的两台电脑用户名一样,所以直接不用做任何修改,用自己这台电脑的默认用户名就行。但是我为了安全,我想新建一个专门用来远程访问的普通用户,可是我发现无论如何都连不上,今天终于解决了,记录一下。首先,本地电脑在windows凭据管理器中删除windows凭据,然后在注册表中搜索远程IP,把......
  • Windows用注册表修改键盘映射(扫描码)
    title:Windows用注册表修改键盘映射(扫描码)date:2020-10-18categories:编程tags:-键盘-注册表-Windows前言使用C/C++代码方式修改可见下篇《用C/C++(Win32API)写软件修改键位》据说Qwerty键盘是为了降低打字员打字速度,防止打字机卡机所作出的妥协。那么现在的键盘是......
  • Oracle怎样写一个sql,将一个不同的表结构的数据迁移到另一个表中,其中有字段需要有映射
    要将一个表的数据迁移到另一个表,并且需要进行字段映射和值转换,可以使用以下步骤:创建目标表:CREATETABLE目标表名(目标字段1数据类型,目标字段2数据类型,...);插入数据并进行字段映射和值转换:INSERTINTO目标表名(目标字段1,目标字段2,...)SELECTCASEWH......
  • Gorm 关联关系介绍与基本使用
    目录一BelongsTo(一对一)1.1BelongsTo1.2重写外键1.3重写引用(一般不用)1.4Belongsto的CRUD1.5预加载1.6外键约束二、HasOne2.1HasOne2.2重写外键2.3重写引用2.4多态关联2.5HasOne的CURD2.6预加载2.7自引用HasOne2.8外键约束三、HasMany3.1HasMany3......