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)
-
网友评论