后端开发中经常需要以分页的方式返回列表数据,一般都会根据查询条件同时返回一页数据和满足条件记录的总数,例如下面这段代码。
func getRecords(db *gorm.DB, filter *Filter) ([]record, int64, error) {
query := db.Where("store_origin_id = ?", filter.StoreOriginId)
if filter.PageSize > 0 && filter.CurrentPage > 0 {
query = query.Offset((filter.CurrentPage - 1) * filter.PageSize).Limit(filter.PageSize)
}
count := int64(0)
err := query.Model(&record{}).Count(&count).Error
if err != nil {
return nil, 0, err
}
if count == 0 {
return nil, 0, nil
}
var records []record
err = query.Order("subscribed_at DESC").Find(&records).Error
if err != nil {
return nil, 0, err
}
return records, count, nil
}
但是这段代码其实是有bug的,在count的前面加了分页的查询参数,最后这个方法是查不到数据的,count数也是0。
为什么会有这个问题呢,我们去除查询条件简化一下上述的sql
SELECT count(*) FROM table LIMIT 10,10
在sql中count(*)只会返回一条count的记录,而后面是去取第offset条之后的10的条数据,所以总数会返回0