前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >gorm将查询结果映射到自定义嵌套结构体,嵌套预加载

gorm将查询结果映射到自定义嵌套结构体,嵌套预加载

作者头像
hotqin888
发布2022-03-10 15:25:39
3.2K0
发布2022-03-10 15:25:39
举报
文章被收录于专栏:hotqin888的专栏hotqin888的专栏

CSDN

CSDN

CSDN

CSDN

我在前面的文章中多处提到gorm如何将查询结果映射到自定义结构体,都没解决,本次就解决了。

1 beego orm 结构体用于建表project

代码语言:javascript
复制
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)"`
}

2 gorm的结构体用于建表userhistory

代码语言:javascript
复制
//用户-历史计算记录表
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"`
}

3 gorm的结构体用于建表passproject

代码语言:javascript
复制
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是本表中的
}

4 自定义结构体userprofession,用于将查询结果映射进来,没有建表

代码语言:javascript
复制
// 专业——典型的一对多关联和自定义结构体
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是本表中的
}

5 查询语句

代码语言:javascript
复制
// 典型的将查询结果映射到自定义结构体,利用了预加载和一对多关联、嵌套预加载
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表。

问题:无法为嵌套结构里的数据排序。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 beego orm 结构体用于建表project
  • 2 gorm的结构体用于建表userhistory
  • 3 gorm的结构体用于建表passproject
  • 4 自定义结构体userprofession,用于将查询结果映射进来,没有建表
  • 5 查询语句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档