介绍
Scopes 使你可以复用通用的逻辑,共享的逻辑需要定义为 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") } 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 的已付款或已发货订单
分页
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)
更新
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
- 本文固定链接: https://www.phpmianshi.com/?id=385
- 转载请注明: admin 于 PHP面试网 发表
《本文》有 0 条评论