Gorm-常见查询操作(二)

2023-04-24 19:46:54 浏览数 (1)

预加载

预加载可以有效地避免 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 关键字连接查询表、定义查询作用域的方法。

go

0 人点赞