美文网首页Golang 入门资料+笔记
gorm实现多对多映射,以及预加载排序

gorm实现多对多映射,以及预加载排序

作者: 五岁小孩 | 来源:发表于2021-03-17 09:19 被阅读0次

    gorm实现多对多映射,以及预加载排序

    • 业务

      一个用户可以有多种语言;一种语言可以被用户使用

      表设计:user表;language表

      user与language 为多对多关系

    • model

      package model
       /**
       foreignkey:主表的字段(与从表关联的字段)
       association_jointable_foreignkey: 从表的字段(与主编关联的字段,外键)
       jointable_foreignkey:中间表,主表的字段(与从表关联的字段)
       */
      import (
        "fmt"
        "github.com/jinzhu/gorm"
        _ "github.com/jinzhu/gorm/dialects/mysql"
      )
       //用户表
      type User struct {
        UserID int
        Uname string
        Languages []Language `gorm:"many2many:user_languages;
        foreignkey:UserID;association_jointable_foreignkey:LanguageID;jointable_foreignkey:UserID;"`
      }
      func (*User)TableName()string{
          return user
      }
      //语言表
      type Language struct {
        LanguageID int
        Name string
      }
      func (*Language)TableName()string{
          return language
      }
      //中间表
      type UserLanguages struct {
        UserId int
        LanguageId int
      }
      func (*Language)TableName()string{
          return user_language
      }
      
      • service

        func QueryUser(){
            var userModel:=model.User{}
            var userData []model.User
            dao.MySQLConn.Model(process).Order("UserId").Preload("Language").Find(&userData)
            fmt.Println(userData)
        }
        
      • 预加载排序

        //user预加载Language,并且按语言名称Name排序
        //db.Preload() 该方法请求参数可以添加func方法,在func中传入gorm.DB,
        //可以在预加载过程执行其他sql操作
        //类比,在gorm的其他方法中的请求参数中也可能允许传入db.*gorm参数
        //注意:
        //故在使用Preload时应注意顺序,如 Preload("Language")--->PreloadPreload("Language.Country")
        //而不是 Preload("Language.Country")--->PreloadPreload("Language"),可能会出现未知错误,如排序失效
        func QueryUser(){
            var userModel:=model.User{}
            var userData []model.User
            dao.MySQLConn.Model(process).Order("UserId").Preload("Language",func(db *gorm.DB)*gorm.DB{
                return db.Order("Name asc")
               
        }).Find(&userData)
            fmt.Println(userData)
        }
        
        //拓展
        //如果多级别预加载,则层级预加载
        //如:user预加载Language(语言)预加载Country(国家)
        //常规写法,.Preload("Language.Country"),无法实现按名称Country.Name排序
        //写法如下:
         dao.MySQLConn.Model(process).Order("UserId").Preload("Language",func(db *gorm.DB)*gorm.DB{
                //再包含一层
             return db.Preload("Country",func(db *gorm.DB) *gorm.DB{
                 return db.Order("Name asc")
             })
            }).Find(&userData)
        

    相关文章

      网友评论

        本文标题:gorm实现多对多映射,以及预加载排序

        本文链接:https://www.haomeiwen.com/subject/lnugxltx.html