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, })
需要返回总页数,总数量可选,方便前端进行分页处理,序列化和状态码看个人。