Files
mayfly-go/server/pkg/model/query_cond.go

166 lines
3.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package model
import (
"fmt"
"mayfly-go/pkg/consts"
"mayfly-go/pkg/utils/anyx"
)
type QueryCond struct {
selectColumns []string // 查询的列信息
condModel any // 条件模型
wheres map[string][]any
orderBy []string
dest any // 结果集指针
}
// NewCond 构建查询条件
func NewCond() *QueryCond {
return &QueryCond{}
}
// NewModelCond 新建模型条件(使用模型中非零值作为条件)
func NewModelCond(condModel any) *QueryCond {
return &QueryCond{condModel: condModel}
}
// 设置结果集绑定的指针
func (q *QueryCond) Dest(dest any) *QueryCond {
q.dest = dest
return q
}
// Columns 设置查询的列
func (q *QueryCond) Columns(columns ...string) *QueryCond {
q.selectColumns = columns
return q
}
func (q *QueryCond) OrderByDesc(column string) *QueryCond {
return q.OrderBy(fmt.Sprintf("%s DESC", column))
}
func (q *QueryCond) OrderByAsc(column string) *QueryCond {
return q.OrderBy(fmt.Sprintf("%s ASC", column))
}
func (q *QueryCond) OrderBy(orderBy ...string) *QueryCond {
q.orderBy = append(q.orderBy, orderBy...)
return q
}
// Eq 等于 =
func (q *QueryCond) Eq(column string, val any) *QueryCond {
return q.Cond(consts.Eq, column, val, true)
}
// Eq 等于 = (零值也不忽略该添加)
func (q *QueryCond) Eq0(column string, val any) *QueryCond {
return q.Cond(consts.Eq, column, val, false)
}
// Like LIKE %xx%
func (q *QueryCond) Like(column string, val string) *QueryCond {
if val == "" {
return q
}
return q.Cond(consts.Like, column, "%"+val+"%", false)
}
// RLike LIKE xx%
func (q *QueryCond) RLike(column string, val string) *QueryCond {
if val == "" {
return q
}
return q.Cond(consts.Like, column, val+"%", false)
}
func (q *QueryCond) In(column string, val any) *QueryCond {
return q.Cond(consts.In, column, val, true)
}
func (q *QueryCond) NotIn(column string, val any) *QueryCond {
return q.Cond(consts.NotIn, column, val, true)
}
func (q *QueryCond) In0(column string, val any) *QueryCond {
return q.Cond(consts.In, column, val, true)
}
// // Ne 不等于 !=
func (q *QueryCond) Ne(column string, val any) *QueryCond {
q.Cond(consts.Ne, column, val, true)
return q
}
// Gt 大于 >
func (q *QueryCond) Gt(column string, val any) *QueryCond {
q.Cond(consts.Gt, column, val, true)
return q
}
// Ge 大于等于 >=
func (q *QueryCond) Ge(column string, val any) *QueryCond {
q.Cond(consts.Ge, column, val, true)
return q
}
// Lt 小于 <
func (q *QueryCond) Lt(column string, val any) *QueryCond {
q.Cond(consts.Lt, column, val, true)
return q
}
// Le 小于等于 <=
func (q *QueryCond) Le(column string, val any) *QueryCond {
q.Cond(consts.Le, column, val, true)
return q
}
// And条件
func (q *QueryCond) And(column string, val ...any) *QueryCond {
if q.wheres == nil {
q.wheres = make(map[string][]any)
}
q.wheres[column] = val
return q
}
func (q *QueryCond) Cond(cond, column string, val any, skipBlank bool) *QueryCond {
// 零值跳过
if skipBlank && anyx.IsBlank(val) {
return q
}
return q.And(fmt.Sprintf("%s %s ?", column, cond), val)
}
func (q *QueryCond) GetWheres() map[string][]any {
return q.wheres
}
func (q *QueryCond) GetCondModel() any {
return q.condModel
}
func (q *QueryCond) GetSelectColumns() []string {
return q.selectColumns
}
func (q *QueryCond) GetOrderBy() []string {
return q.orderBy
}
// 获取输出目标结果集指针若dest为空则使用condModel
func (q *QueryCond) GetDest() any {
if !anyx.IsBlank(q.dest) {
return q.dest
}
if !anyx.IsBlank(q.condModel) {
return q.condModel
}
panic("*model.QueryCond dest and condModel is nil")
}