Files

61 lines
1.3 KiB
Go

package gormx
import (
"gorm.io/gorm"
)
type LimitHandler func(db *gorm.DB) *gorm.DB
func Finder[T any](model T, db *gorm.DB, objs ...LimitHandler) (int64, []T, error) {
for _, obj := range objs {
db = obj(db)
}
var models []T
err := db.Model(&model).Find(&models).Error
if err != nil {
return 0, nil, err
}
var sum int64
err = db.Model(&model).Count(&sum).Error
return sum, models, err
}
// FinderPage 分页查找
func FinderPage[T any](db *gorm.DB, page, limit int, objs ...LimitHandler) (int64, []T, error) {
return pageFinder[T](db, pageHandle(page, limit), objs...)
}
func pageFinder[T any](db *gorm.DB, limit LimitHandler, objs ...LimitHandler) (int64, []T, error) {
// 定义表
var model T
db = db.Model(&model)
for _, obj := range objs {
db = obj(db)
}
// 查找全部数量
var sum int64
if err := db.Model(&model).Count(&sum).Error; err != nil {
return 0, nil, err
}
// 分页查找
db = limit(db)
var models []T
if err := db.Find(&models).Error; err != nil {
return 0, nil, err
}
return sum, models, nil
}
func pageHandle(page, limit int) LimitHandler {
return func(db *gorm.DB) *gorm.DB {
// 用户输入起始位
var beginIndex int
if page < 0 {
beginIndex = -1
} else {
beginIndex = (page - 1) * limit
}
return db.Offset(beginIndex).Limit(limit)
}
}