Golang笔记|gin+gorm 实现数据分页查询

3,941 阅读1分钟
  1. 准备工作
  2. 包装分页工具函数
  3. 使用gorm中的Scopes调用分页

一、准备工作

admin.go

type Admin struct {
   Id        int64          `json:"id"`
   Username  string         `json:"username"`   // 用户名
   Nickname  string         `json:"nickname"`   // 用户名
   Avatar    string         `json:"avatar"`     // 头像
   Password  string         `json:"-"`          // 密码
   Status    int64          `json:"status"`     // 状态 1. 正常 0 禁用
   CreatedAt Time           `json:"created_at"` // 创建时间
   UpdatedAt Time           `json:"-"`          // 更新时间
   DeletedAt gorm.DeletedAt `json:"-"`
}


func (admin Admin) TableName() string {
   return "admins"
}

二、 包装分页工具函数

在utils文件下新建Paginate.go

func Paginate(req *dto.PageDto) func(db *gorm.DB) *gorm.DB {
   return func(db *gorm.DB) *gorm.DB {
      page := req.Page
      if page == 0 {
         page = 1
      }
      pageSize := req.PageSize
      switch {
      case pageSize > 100:
         pageSize = 100
      case pageSize <= 0:
         pageSize = 10
      }
      offset := (page - 1) * pageSize
      return db.Offset(offset).Limit(pageSize)
   }
}

PageDto

page: 当前页码

pageSize: 每页的条数

type PageDto struct {
   Page     int `form:"page" json:"page"`
   PageSize int `form:"pageSize" json:"pageSize"`
}

三、使用gorm中的Scopes调用分页

列表接收参数 AdminListReq

type AdminListReq struct {
   Nickname string `json:"nickname"` // 搜索名称
   PageDto
}

在admin.go文件中编写获取列表函数 使用Scopes调用分页

// GetAdminList 获取全部TableUser对象
func GetAdminList(req *dto.AdminListReq) (admins []Admin, total int64, err error) {
   query := DB.Model(Admin{})
   if req != nil {
      if req.Nickname != "" {
         query.Where("nickname like ?", "%"+req.Nickname+"%")
      }
   }

   // 排序
   query = query.Order("id desc")

   pageReq := &dto.PageDto{
      Page:     req.Page,
      PageSize: req.PageSize,
   }

   err = query.Scopes(utils.Paginate(pageReq)).Find(&admins).Count(&total).Error

   if err != nil {
      return nil, 0, err
   }

   return admins, total, nil
}

最后admins数组中就是想要得到的数据,total为总条数,至于接口数据如何返回可自行定义。