分享一下利用gorm查询的时候,添加上分页的经历
原理:
先查出数据库符合要求的一共多少条数据,然后,利用页码数和每页几条数据,计算出要查询的是哪些数据
业务层代码
stroreId := utils.StringToUint(c.PostForm("store_id"))
Page := utils.StringToUint(c.PostForm("page"))
Limit := utils.StringToUint(c.PostForm("limit"))
//StringToUint,自己封装的一个string转uint的函数
var res interface{}
var page uint
var total int64
res, page, total = models.GetListByTrueStoreid(uint(stroreId), Page, Limit)
c.JSON(200, gin.H{
"code": 200,
"msg": "请求成功!",
"data": res,
"page": page,
"total": total,
})
数据层:
type CardOrderReturn struct {
Id uint `json:"id"`
CardCut float64 `json:"card_cut"`
Creattime uint `json:"creattime"`
Cname string `json:"cname"`
OrderSn string `json:"order_sn"`
Type uint `json:"type"`
TypeName string `json:"type_name"`
}
func (table *CardOrderReturn) TableName() string {
return "os_order"
}
func GetListByTrueStoreid(storeId, Page, Limit uint) ([]CardOrderReturn, uint, int64) {
order := []CardOrderReturn{}
var total int64
offset := (Page - 1) * Limit
utils.DB.Limit(int(Limit)).Offset(int(offset)).Select("os_order.id as id,os_order.card_cut as card_cut,os_order.creattime,os_order.order_sn,os_card.cname as cname").Joins("left join os_card on os_order.card_id = os_card.id").Where("true_store_id = ? and order_status = 2 and status = 2", storeId).Order("id desc").Find(&order)
utils.DB.Model(&order).Joins("left join os_card on os_order.card_id = os_card.id").Where("true_store_id = ? and order_status = 2 and status = 2", storeId).Count(&total)
for i := range order {
order[i].Type = 1
order[i].TypeName = "消费"
}
return order, Page, total
}
相比于正常的查询,添加上两部分
偏移查询
.Limit(int(Limit)).Offset(int(offset))
计算出总量
添加上model,然后Count一下,
需要注意的是,这里,虽然是Model的A表,但是求的数量,也是和关联表B,并且附加筛选条件之后的结果,而不是单独A表的数据数量
Model(&order).Joins("left join xxxxx").Where(xxxxxx).Count(&total)
这个是调用之后的结果
上面结构体的名字是CardOrderReturn,这个是在原来的结构体Order和Card之外,单独为这个函数返回值特地写的结构体,只写要用的字段