我在前面的文章中多处提到gorm如何将查询结果映射到自定义结构体,都没解决,本次就解决了。
type Project struct {
Id int64 `form:"-"`
Code string `orm:"null"` //编号
Title string `form:"title;text;title:",valid:"MinSize(1);MaxSize(20)"` //orm:"unique",
Label string `orm:"null"` //标签
Principal string `orm:"null"` //负责人id
ParentId int64 `orm:"null"`
ParentIdPath string `orm:"null"`
ParentTitlePath string `orm:"null"`
Grade int `orm:"null"`
Created time.Time `orm:"null","auto_now_add;type(datetime)"`
Updated time.Time `orm:"null","auto_now_add;type(datetime)"`
}
//用户-历史计算记录表
type UserHistory struct {
gorm.Model
// ID int `gorm:"primary_key"`
UserID int64 `json:"userid" gorm:"column:user_id;"`
UserTempleID uint `json:"tempid" gorm:"column:user_temple_id"`
User User `gorm:"foreignkey:Id;references:UserID;"`
UserTemple UserTemple
PdfUrl string `json:"pdfurl"`
FaceImgUrl string `json:"faceimgurl"`
Description string `json:"description"`
}
type PassProject struct {
gorm.Model
UserHistoryID uint `json:"historyid" gorm:"column:history_id;`
ProjectId int64 `json:"projectid" gorm:"column:project_id;`
Userhistory UserHistory `json:"userhistory" gorm:"foreignKey:ID;references:UserHistoryID;"` //ID是UserHistory结构中的,UserHistoryID是本表中的
}
// 专业——典型的一对多关联和自定义结构体
type UserProfession struct {
// gorm.Model
Id int64
// ProjectId int64
Title string `json:"profession_title"` //阶段名称
// UserHistoryID uint
PassProjects []PassProject `gorm:"foreignKey:ProjectId;references:Id;"` //ProjectId是PassProject数据结构中的,Id是本表中的
}
// 典型的将查询结果映射到自定义结构体,利用了预加载和一对多关联、嵌套预加载
func GetProjectMathHis(projectid int64) (userprofession []UserProfession, err error) {
db := _db
err = db.Table("project"). //Order("project.updated desc"). //Order("pass_projects.userhistory.updated_at desc").
Preload("PassProjects").
Preload("PassProjects.Userhistory"). //嵌套预加载
Where("project.parent_id = ?", projectid).
Find(&userprofession).Error
return userprofession, err
}
简要说明:
project项目表是无限级数据表,有parentid,比如项目——项目阶段——专业
userhistory是一个记录历史数据的表
passproject就是一个将userhistory数据的id和project里专业那一级的数据进行对应的表,即userhistoryid和projectid
自定义数据结构体userprofession是希望给定一个项目阶段的id,即项目专业id的parentid,查出多个专业id,用专业id查出userhistoryid。即userprofession里嵌套了passproject
需要注意的是:嵌套的名字要与表名不一致。
然后就是foreignKey是关联表的ID,preference是本表中的某个ID。
用嵌套预加载preload去加载passproject表里关联的userhistory表。
问题:无法为嵌套结构里的数据排序。