在我们编写的项目的时候,列表总是有各种条件进行查询,不过一般都是and 查询,这里编写了一个稍微通用些的方法利用scopes,返回列表查询数据;
创建orm文件:这里目录结构我这边设计是存在名叫ormModels 文件夹中,新建base.go文件
package ormModels
import (
"github.com/spf13/cast"
"gorm.io/gorm"
"reflect"
)
// 这里是分页也相关 传入参数 page和 size, 以及对应 默认分页配置 s eg:map[string]interface{}{"page" : 1, "size" : 20}, 如果传入为 map[string]interface{}{},默认设定 page 1, size 20
func Paginate(pageParam interface{}, sizeParam interface{}, s map[string]interface{}) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
page := cast.ToInt(pageParam)
size := cast.ToInt(sizeParam)
if page == 0 {
if s["page"] != nil {
page = s["page"].(int)
} else {
page = 1
}
}
if size == 0 {
if s["size"] != nil {
size = s["size"].(int)
} else {
size = 20
}
}
offset := (page - 1) * size
return db.Offset(offset).Limit(size)
}
}
func Order(sort string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
returnDb := db
if len(sort) == 0 {
sort = "id desc"
}
return returnDb.Order(sort)
}
}
//进行快速条件过滤
func StringFilter(key string, value string, operator string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
returnDb := db
if value != "" {
switch operator {
case "like":
returnDb = returnDb.Where(key+" Like ? ", "%"+value+"%")
case "=", ">=", ">", "<=", "<":
returnDb = returnDb.Where(key+" "+operator+" "+"?", value)
}
}
return returnDb
}
}
// 进行wehre in 或者 where not in
func ArrayFilter(key string, value interface{}, operator string) func(db *gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
returnDb := db
if reflect.ValueOf(value).Len() != 0 {
whereMap := map[string]interface{}{
key: value,
}
switch operator {
case "in":
returnDb = returnDb.Where(whereMap)
case "not in":
returnDb = returnDb.Not(whereMap)
}
}
return returnDb
}
}
之后创建的所有模型都可以进行使用分页 和 where 查询 使用方法:
builder.Scopes(ormModels.Paginate(params.Page, params.Size, map[string]interface{}{})).
Find(&list)
builder := ormModels.GetDb().Model(&ormModels.Test{}).
Scopes(ormModels.StringFilter("state", params.State, "=")).
Scopes(ormModels.StringFilter("tax_no", params.TaxNo, "like"))
builder := ormModels.GetDb().Model(&ormModels.Test{}).
Scopes(ormModels.ArrayFilter("serial_no", params.SerialNos, "in")).