gorm中的scope

作用域允许您重用常用逻辑,共享逻辑需要定义为类型

func(*gorm.DB) *gorm.DB

查询

func Scope1(db *gorm.DB) *gorm.DB {
	return db.Where("name = ?", "哈哈哈")
}
func Scope2(slice1 []int) func(tx *gorm.DB) *gorm.DB {
	return func(tx *gorm.DB) *gorm.DB {
		return tx.Where("age IN (?)", slice1)
	}
}

var users []User
db.Debug().Scopes(Scope2([]int{7, 55})).Find(&users)
fmt.Println(users)

分页

func Paginate(ctx *gin.Context) func(db *gorm.DB) *gorm.DB {
	// 分页功能实现
	return func(db *gorm.DB) *gorm.DB {
		page, _ := strconv.Atoi(ctx.Query("page"))
		if page == 0 {
			page = 1
		}
		size, _ := strconv.Atoi(ctx.Query("size"))
		fmt.Println(size)
		switch{
		case size > 100:
			size = 100
		case size < 1:
			size = 10
		}
		offset := (page - 1) * size
		return db.Offset(offset).Limit(size)
	}
}

// 分页
router := gin.Default()

  router.GET("/json", func(context *gin.Context) {
    var users []User
    db.Scopes(Paginate(context)).Find(&users)  // 等价于:Paginate(context)(db).Find(&users)
    context.JSON(http.StatusOK, users)
  })

router.Run(":8000")

更新

Scope 更新、删除示例:

func CurUser(ctx *gin.Context) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		name := ctx.Query("name")
		if name != "" {
			var user User
			fmt.Println(name)
			if db.Session(&gorm.Session{}).First(&user, "name = ?", name).Error == nil {
				return db.Where("id = ?", user.ID)
			}
		}
		db.AddError(errors.New("invalid user"))
		return db
	}
}

// 分页
router := gin.Default()

router.GET("/json", func(context *gin.Context) {
  var users []User
  // 更新
		      
  //db.Model(new(User)).Scopes(CurUser(context)).Update("name", "新版user")
  // 删除
  db.Scopes(CurUser(context)).Delete(&User{})
  context.JSON(http.StatusOK, users)
})

router.Run(":8000")
posted @ 2021-11-25 17:38  专职  阅读(1518)  评论(0编辑  收藏  举报