说人话的 GORM文档 之 Scopes

41 min read

什么是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 的信用卡订单

在这个示例中,我们定义了两个 ScopeAmountGreaterThan1000PaidWithCreditCard。然后我们使用 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 的函数,它接受两个参数:pagepageSize。这个函数返回一个匿名函数,该匿名函数接受一个 *gorm.DB 类型的参数,并返回一个新的 *gorm.DB 实例。在这个匿名函数中,我们使用 OffsetLimit 方法来实现分页查询。

然后我们使用 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

在这个示例中,我们定义了一个名为 OnlyActiveScope,它用于筛选出所有状态为 active 的用户。然后我们使用 Scopes 方法将这个 Scope 应用到删除和更新操作中。

在第一个操作中,我们使用 Delete 方法来删除所有状态为 active 的用户。在第二个操作中,我们使用 ModelUpdate 方法来将所有状态为 active 的用户的状态更新为 inactive