什么是Scopes?
Scopes
是 GORM 提供的一种功能,它允许您复用通用的逻辑。这种共享逻辑需要定义为类型 func (*gorm.DB) *gorm.DB
。下面是一个简单的示例:
func AmountGreaterThan1000(db *gorm.DB) *gorm.DB { return db.Where("amount > ?", 1000) } func PaidWithCreditCard(db *gorm.DB) *gorm.DB { return db.Where("pay_mode_sign = ?", "C") } db.Scopes(AmountGreaterThan1000, PaidWithCreditCard).Find(&orders) // 查找所有金额大于 1000 的信用卡订单
在这个示例中,我们定义了两个 Scope
:AmountGreaterThan1000
和 PaidWithCreditCard
。然后我们使用 Scopes
方法将这两个 Scope
应用到查询中,以查找所有金额大于 1000 的信用卡订单。
Scopes实现分页查询
您可以使用 Scopes
来实现分页查询。下面是一个简单的示例:
func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { offset := (page - 1) * pageSize return db.Offset(offset).Limit(pageSize) } } db.Scopes(Paginate(1, 10)).Find(&users) // 查询第 1 页,每页 10 条记录
在这个示例中,我们定义了一个名为 Paginate
的函数,它接受两个参数:page
和 pageSize
。这个函数返回一个匿名函数,该匿名函数接受一个 *gorm.DB
类型的参数,并返回一个新的 *gorm.DB
实例。在这个匿名函数中,我们使用 Offset
和 Limit
方法来实现分页查询。
然后我们使用 Scopes
方法将 Paginate
函数应用到查询中,以查询第 1 页,每页 10 条记录。
Scopes实现指定查询的表
您可以使用 Scopes
来实现指定查询的表。下面是一个简单的示例:
func SetTable(tableName string) func(db *gorm.DB) *gorm.DB { return func(db *gorm.DB) *gorm.DB { return db.Table(tableName) } } db.Scopes(SetTable("users")).Find(&users) // 在 users 表中查询所有记录
在这个示例中,我们定义了一个名为 SetTable
的函数,它接受一个参数:tableName
。这个函数返回一个匿名函数,该匿名函数接受一个 *gorm.DB
类型的参数,并返回一个新的 *gorm.DB
实例。在这个匿名函数中,我们使用 Table
方法来指定查询的表。
然后我们使用 Scopes
方法将 SetTable
函数应用到查询中,以在 users
表中查询所有记录。
Scopes
来实现更新和删除操作
您可以使用 Scopes
来实现更新和删除操作。下面是一个简单的示例:
func OnlyActive(db *gorm.DB) *gorm.DB { return db.Where("status = ?", "active") } db.Scopes(OnlyActive).Delete(&User{}) // 删除所有状态为 active 的用户 db.Scopes(OnlyActive).Model(&User{}).Update("status", "inactive") // 将所有状态为 active 的用户的状态更新为 inactive
在这个示例中,我们定义了一个名为 OnlyActive
的 Scope
,它用于筛选出所有状态为 active
的用户。然后我们使用 Scopes
方法将这个 Scope
应用到删除和更新操作中。
在第一个操作中,我们使用 Delete
方法来删除所有状态为 active
的用户。在第二个操作中,我们使用 Model
和 Update
方法来将所有状态为 active
的用户的状态更新为 inactive
。