基本介绍

在分页查询场景中,我们往往需要先调用Scan方法结合Limit/Page链式操作方法查询列表,随后再去掉Limit/Page链式操作方法查询总数量。这一过程较为繁琐,因此从v2.5.0版本开始,框架提供了ScanAndCount方法,用于简化分页查询的场景。

使用示例

示例代码来源于业务项目案例,仅供参考理解,无法独立运行。

使用传统的分页查询逻辑代码:

// GetList 获取实例的用户列表.
func (s sUserInfo) GetList(ctx context.Context, in model.UserInfoGetListInput) (items []entity.UserInfo, total int, err error) {
	items = make([]entity.UserInfo, 0)
	orm := dao.UserInfo.Ctx(ctx).OmitEmpty().Where(do.UserInfo{
		ResourceId: in.ResourceId,
		Status:     in.Statuses,
	})
	err = orm.Order(in.OrderBy, in.OrderDirection).Limit(in.Offset, in.Limit).Scan(&items)
	if err != nil {
		return
	}
	total, err = orm.Count()
	return
}

使用ScanAndCount方法实现分页查询:

// GetList 获取实例的用户列表.
func (s sUserInfo) GetList(ctx context.Context, in model.UserInfoGetListInput) (items []entity.UserInfo, total int, err error) {
	items = make([]entity.UserInfo, 0)
	err = dao.UserInfo.Ctx(ctx).OmitEmpty().
		Where(do.UserInfo{
			ResourceId: in.ResourceId,
			Status:     in.Statuses,
		}).
		Order(in.OrderBy, in.OrderDirection).
		Limit(in.Offset, in.Limit).
		ScanAndCount(&items, &total, true)
	return
}

注意事项

  • 仅用于需要同时查询数据和总数量的场景,一般为分页场景。
  • ScanAndCount的第3个参数useFieldForCount表示是否在执行Count操作的时候将Fields作为Count参数,一般为true即可。传递false表示执行COUNT(1)查询总数量。




Content Menu

  • No labels

4 Comments

  1. in.OrderDirection是个啥
    1. 排序顺序咯,ascdesc

  2. 等一手ScanListAndCount

    1. 直接Scan就将查询记录转换到数组了。