gorm的preload预加载笔记
假设,有三张表的层级关系为 Audit–>User -->homePage (具体表结构请查看末尾的大标题)
像下面的方法,是取不到auditData.Auditor
中的值的
var auditData Audit
global.GVA_DB.Model(&auditData).Where("id = 1").First(&auditData)
常规预加载
如果要拿到这个Auditor
对象
举例我要查找Audit表中id为1的数据,并且要拿到Auditor字段中的数据
var auditData Audit
global.GVA_DB.Model(&auditData).Preload("Auditor").Where("id = 1").First(&auditData)
多级预加载
举例我要查找Audit表中id为1的数据,除了要拿到Auditor
中的数据外,Auditor
中HomePage
的数据也要拿到。
var auditData Audit
global.GVA_DB.Model(&auditData).Preload("Auditor.HomePage").Where("id = 1").First(&auditData)
preload的原理
其实很简单,你要preload user表的数据,gorm就提前把这张表全部取出来,然后再执行First
或Find
这样的方法去查询主数据。最后把两种数据一一对应起来。
示例中的数据表结构体说明
假设有以下三张表的结构体
-
homePage 主页表结构体
type HomePage struct { global.GVA_MODEL UserId uint `json:"userId" gorm:"column:user_id;comment:'用户id'"` Desc string `json:"desc" form:"desc" gorm:"column:desc;type:varchar(500);comment:主页描述 "` Phone string `json:"phone" form:"phone" gorm:"column:phone;comment:联系电话"` Email string `json:"email" form:"email" gorm:"column:email;comment:邮箱"` } func (HomePage) TableName() string { return "home_page" }
这张表主要特点是有一个
UserId
,用来将单挑数据绑定到下面的User表中的某条数据。 -
User 用户表结构体
type User struct { global.GVA_MODEL Username string `json:"userName" form:"userName" gorm:"column:user_name;comment:用户登录名"` HomePage HomePage `json:"homePage" gorm:"foreignkey:UserId"` } func (User) TableName() string { return "user" }
这里用到了gorm的,Has One外键关联了HomePage表,这个HomePage在实际的User表中是不存在的。
-
Audit审批表结构体
type Audit struct { global.GVA_MODEL //提交人 SubmitterId uint `json:"submitterId" form:"submitterId" gorm:"column:submitter_id;comment: 申请单提交用户的id"` Submitter User `gorm:"foreignkey:SubmitterId"` //审批人 AuditorId uint `json:"auditorId" form:"auditorId" gorm:"column:auditor_id;comment:审批人id"` Auditor User `gorm:"foreignkey:AuditorId"` AuditStatus uint `json:"auditStatus" form:"auditStatus" gorm:"column:audit_status;comment:审批状态:1未通过 2已通过 3待审核 "` } func (Audit) TableName() string { return "audit" }
里面的Submitter和Auditor通过gorm的Belongs To关联到了User表。