预加载示例
GORM允许使用 Preload
通过多个SQL中来直接加载关系, 例如:
type User struct { |
Joins 预加载
Preload
在一个单独查询中加载关联数据。而 Join Preload
会使用 left join 加载关联数据,例如:
db.Joins("Company").Joins("Manager").Joins("Account").First(&user, 1) |
带条件的 Join
db.Joins("Company", DB.Where(&Company{Alive: true})).Find(&users) |
注意
Join Preload
适用于一对一的关系,例如:has one
,belongs to
预加载全部
与创建、更新时使用 Select
类似,clause.Associations
也可以和 Preload
一起使用,它可以用来 预加载
全部关联,例如:
type User struct { |
clause.Associations
不会预加载嵌套的关联关系,但是你可以将其与嵌套预加载一起使用, 例如:
db.Preload("Orders.OrderItems.Product").Preload(clause.Associations).Find(&users) |
条件预加载
GORM 允许带条件的 Preload 关联,类似于内联条件
// 带条件的预加载 Order |
自定义预加载 SQL
您可以通过 func(db *gorm.DB) *gorm.DB
实现自定义预加载 SQL,例如:
db.Preload("Orders", func(db *gorm.DB) *gorm.DB { |
嵌套预加载
GORM 支持嵌套预加载,例如:
db.Preload("Orders.OrderItems.Product").Preload("CreditCard").Find(&users) |