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.查询结果

 

posted on 2024-01-16 15:46  飘杨......  阅读(22)  评论(0编辑  收藏  举报