gorm 分页
分享一下利用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 int64res, 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 int64offset := (Page - 1) * Limitutils.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 = 1order[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之外,单独为这个函数返回值特地写的结构体,只写要用的字段