ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

gorm 分页

2026/9/26 1:34:04 拓冰建站 浏览量
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之外,单独为这个函数返回值特地写的结构体,只写要用的字段