GORM分页插件

自己封装了一个GORM的分页插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package paginate
/*
使用方法
var demo entity.Demo
pageReq := paginate.PageReq{Page: 1, PageSize: 10}
pageResp, err := paginate.Page(db, &pageReq, &demo)
for i, i2 := range pageResp.Data {
fmt.Println(i)
fmt.Println(i2)
}
*/

import (
"fmt"
"gorm.io/gorm"
"math"
)

// PageResp 分页返回值
// data: 使用范型,返回值是数组
type PageResp[T any] struct {
TotalCount int64 `json:"total_count"` // 总条数
TotalPage int `json:"total_page"` // 总页数
Data []T `json:"data"` // 消息实体
PageSize int `json:"page_size"` // 每页条数
Page int `json:"page"` // 当前页数
}

// PageReq 分页输入参数
type PageReq struct {
Page int `json:"page" form:"page"` // 第几页
PageSize int `json:"page_size" form:"page_size"` // 每页条数
Sort int `json:"sort" form:"sort"` // 排序
}

// Page 分页插件
func Page[T any](db *gorm.DB, pageReq *PageReq, model T) (*PageResp[T], error) {
var (
err error
count int64
result PageResp[T]
data []T
)
err = db.Model(model).Count(&count).Error
fmt.Println(count)
if err := db.Model(model).Scopes(paginate(pageReq)).Scan(&data).Error; err != nil {
return nil, err
}
result.TotalCount = count
result.Data = data
result.Page = pageReq.Page
result.PageSize = pageReq.PageSize
result.TotalPage = int(math.Ceil(float64(count) / float64(pageReq.PageSize)))
return &result, err
}

// 使用方法:db.Scopes(Paginate(pageReq)).Find(&users)
func paginate(pageReq *PageReq) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
var (
page = pageReq.Page
pageSize = pageReq.PageSize
)
if page == 0 {
page = 1
}
switch {
case pageSize > 1000:
pageSize = 1000
case pageSize <= 0:
pageSize = 10
}
offset := (page - 1) * pageSize
return db.Offset(offset).Limit(pageSize)
}
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!