Scopes 使你可以复用通用的逻辑,共享的逻辑需要定义为 func(*gorm.DB) *gorm.DB 类型

查询

Scope 查询示例:

  1. 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")
    }

    func PaidWithCod(db *gorm.DB) *gorm.DB {
    return db.Where("pay_mode_sign = ?", "C")
    }

    func OrderStatus(status []string) func (db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
    return db.Where("status IN (?)", status)
    }
    }

    db.Scopes(AmountGreaterThan1000, PaidWithCreditCard).Find(&orders)
    // 查找所有金额大于 1000 的信用卡订单

    db.Scopes(AmountGreaterThan1000, PaidWithCod).Find(&orders)
    // 查找所有金额大于 1000 的 COD 订单

    db.Scopes(AmountGreaterThan1000, OrderStatus([]string{"paid", "shipped"})).Find(&orders)
    // 查找所有金额大于1000 的已付款或已发货订单

分页

  1. func Paginate(r *http.Request) func(db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
    page, _ := strconv.Atoi(r.Query("page"))
    if page == 0 {
    page = 1
    }

    pageSize, _ := strconv.Atoi(r.Query("page_size"))
    switch {
    case pageSize > 100:
    pageSize = 100
    case pageSize <= 0:
    pageSize = 10
    }

    offset := (page - 1) * pageSize
    return db.Offset(offset).Limit(pageSize)
    }
    }

    db.Scopes(Paginate(r)).Find(&users)
    db.Scopes(Paginate(r)).Find(&articles)

更新

Scope 更新、删除示例:

  1. func CurOrganization(r *http.Request) func(db *gorm.DB) *gorm.DB {
    return func (db *gorm.DB) *gorm.DB {
    org := r.Query("org")

    if org != "" {
    var organization Organization
    if db.Session(&Session{}).First(&organization, "name = ?", org).Error == nil {
    return db.Where("org_id = ?", org.ID)
    }
    }

    db.AddError("invalid organization")
    return db
    }
    }

    db.Model(&article).Scopes(CurOrganization(r)).Update("Name", "name 1")
    // UPDATE articles SET name = "name 1" WHERE org_id = 111
    db.Scopes(CurOrganization(r)).Delete(&Article{})
    // DELETE FROM articles WHERE org_id = 111