美文网首页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