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 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)

这个是调用之后的结果

gorm 分页_第1张图片

上面结构体的名字是CardOrderReturn,这个是在原来的结构体Order和Card之外,单独为这个函数返回值特地写的结构体,只写要用的字段

你可能感兴趣的:(golang,数据库,gorm,golang)