预加载
预加载可以有效地避免 N 1 问题,即在查询时,会进行额外的查询操作,导致性能下降。GORM 支持多种预加载方法,例如:
Preload
:在查询时预加载关联的记录。Joins
:使用 JOIN 关键字连接查询表。Scopes
:定义查询作用域。
下面是一个示例,演示如何使用这些方法进行预加载:
代码语言:javascript复制type Order struct {
ID uint
UserID uint
User User
OrderDetail []OrderDetail
}
type OrderDetail struct {
ID uint
OrderID uint
ProductID uint
Quantity uint
Product Product
}
type Product struct {
ID uint
Name string
Price float64
}
// 在查询订单时,预加载订单详情和产品信息
var order Order
db.Preload("OrderDetail").Preload("OrderDetail.Product").First(&order)
// 使用 JOIN 关键字连接查询表
var userWithOrders []User
db.Joins("LEFT JOIN orders ON orders.user_id = users.id").Find(&userWithOrders)
// 定义查询作用域
func withName(name string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Where("name LIKE ?", name)
}
}
var scopedUsers []User
db.Scopes(withName("B%")).Find(&scopedUsers)
上面的代码中,我们演示了如何在查询订单时预加载订单详情和产品信息、使用 JOIN 关键字连接查询表、定义查询作用域的方法。