gorm分页操作

一、绑定参数:

type Page struct {
    Page    int `form:"page"`
    Size    int `form:"size"`
    Desc    int `form:"desc"`
}
//-------------router内-----------------------------//
var p Page
if c.ShouldBindQuery(&p) != nil {
c.JSON(http.StatusUnauthorized, gin.H{
"error": "参数错误",
})
return
}
page := p.Page
pageSize := p.Size
desc := p.Desc
if page <= 0 {
  page = 1
}
 

构建传参结构体,包含页码、分页大小以及正负序,除此之外还可以拓展关键字keyword,使用like进行模糊搜索,这里就不展开了。

二、计算总页数:

var total int
DB.Model(&Comment{}).Count(&total)
pageNum := total / pageSize
if total % pageSize != 0{
    pageNum++
}

先计算总数量total,用总的数量total整除页大小pageSize得到页数量pageNum(有余数需要加一页)。

拓展:对比总页数和选择页数,如果超出范围,就返回错误。

三、分页查询:

err = DB.Limit(pageSize).Offset((page-1)*pageSize).Find(&comments).Error
if err != nil {
    c.JSON(http.StatusUnauthorized, gin.H{
        "error":  err.Error(),
    })
}

Limit:返回的数量,即页大小

Offset:按顺序跳过数量(一般以创建时间为标准),数量为 (页数 - 1) * 页大小

Find:不解释了

可能用到的拓展:

.Order("created_at desc")     // 按创建时间反向
.Where(fmt.Sprintf(" comment like %q ", ("%" + keyword)))  // 关键字模糊搜索

四、返回样例

c.JSON(200, gin.H{
    "status":  "success",
    "data": serializer.BuildComments(comments),
    "total": total,
    "page_num": pageNum,
})

需要返回总页数,总数量可选,方便前端进行分页处理,序列化和状态码看个人。

 

posted @ 2021-03-28 00:23  mirrorlied  阅读(5815)  评论(1编辑  收藏  举报