2024-04-28 23:45:57 +08:00
|
|
|
|
package model
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"mayfly-go/pkg/consts"
|
|
|
|
|
|
"mayfly-go/pkg/utils/anyx"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
type QueryCond struct {
|
|
|
|
|
|
selectColumns []string // 查询的列信息
|
|
|
|
|
|
condModel any // 条件模型
|
|
|
|
|
|
|
2024-05-09 21:29:34 +08:00
|
|
|
|
wheres map[string][]any
|
2024-04-28 23:45:57 +08:00
|
|
|
|
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条件
|
2024-05-09 21:29:34 +08:00
|
|
|
|
func (q *QueryCond) And(column string, val ...any) *QueryCond {
|
2024-04-28 23:45:57 +08:00
|
|
|
|
if q.wheres == nil {
|
2024-05-09 21:29:34 +08:00
|
|
|
|
q.wheres = make(map[string][]any)
|
2024-04-28 23:45:57 +08:00
|
|
|
|
}
|
|
|
|
|
|
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)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-09 21:29:34 +08:00
|
|
|
|
func (q *QueryCond) GetWheres() map[string][]any {
|
2024-04-28 23:45:57 +08:00
|
|
|
|
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")
|
|
|
|
|
|
}
|