假设,有三张表的层级关系为 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中的数据外,AuditorHomePage的数据也要拿到。

var auditData Audit
global.GVA_DB.Model(&auditData).Preload("Auditor.HomePage").Where("id = 1").First(&auditData)

preload的原理

其实很简单,你要preload user表的数据,gorm就提前把这张表全部取出来,然后再执行FirstFind这样的方法去查询主数据。最后把两种数据一一对应起来。


示例中的数据表结构体说明

假设有以下三张表的结构体

  1. 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表中的某条数据。

  2. 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表中是不存在的。

  3. 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表。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐