在我们编写的项目的时候,列表总是有各种条件进行查询,不过一般都是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")).