Files
mayfly-go/server/pkg/gormx/query.go

144 lines
3.0 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 gormx
import (
"fmt"
"mayfly-go/pkg/consts"
"mayfly-go/pkg/global"
"mayfly-go/pkg/utils"
"strings"
"gorm.io/gorm"
)
type QueryCond struct {
selectColumns string // 查询的列信息
joins string // join 类似 left join emails on emails.user_id = users.id
dbModel any // 数据库模型
condModel any // 条件模型
columns []string // 查询的所有列与values一一对应
values []any // 查询列对应的值
orderBy []string
}
// NewQuery 构建查询条件
func NewQuery(dbModel any) *QueryCond {
return &QueryCond{dbModel: dbModel}
}
func (q *QueryCond) WithCondModel(condModel any) *QueryCond {
q.condModel = condModel
return q
}
func (q *QueryCond) WithOrderBy(orderBy ...string) *QueryCond {
q.orderBy = append(q.orderBy, orderBy...)
return q
}
func (q *QueryCond) Select(columns ...string) *QueryCond {
q.selectColumns = strings.Join(columns, ",")
return q
}
func (q *QueryCond) Joins(joins string) *QueryCond {
q.joins = joins
return q
}
// Eq 等于 =
func (q *QueryCond) Eq(column string, val any) *QueryCond {
return q.Cond(consts.Eq, column, val)
}
func (q *QueryCond) Like(column string, val string) *QueryCond {
if val == "" {
return q
}
return q.Cond(consts.Like, column, "%"+val+"%")
}
func (q *QueryCond) RLike(column string, val string) *QueryCond {
if val == "" {
return q
}
return q.Cond(consts.Like, column, val+"%")
}
func (q *QueryCond) In(column string, val any) *QueryCond {
return q.Cond(consts.In, column, val)
}
func (q *QueryCond) OrderByDesc(column string) *QueryCond {
q.orderBy = append(q.orderBy, fmt.Sprintf("%s DESC", column))
return q
}
func (q *QueryCond) OrderByAsc(column string) *QueryCond {
q.orderBy = append(q.orderBy, fmt.Sprintf("%s ASC", column))
return q
}
func (q *QueryCond) GenGdb() *gorm.DB {
gdb := global.Db.Model(q.dbModel)
if q.selectColumns != "" {
gdb.Select(q.selectColumns)
}
if q.joins != "" {
gdb.Joins(q.joins)
}
if q.condModel != nil {
gdb.Where(q.condModel)
}
for i, v := range q.columns {
gdb.Where(v, q.values[i])
}
if len(q.orderBy) > 0 {
gdb.Order(strings.Join(q.orderBy, ","))
} else {
gdb.Order("id desc")
}
return gdb
}
// // Ne 不等于 !=
func (q *QueryCond) Ne(column string, val any) *QueryCond {
q.Cond(consts.Ne, column, val)
return q
}
// Gt 大于 >
func (q *QueryCond) Gt(column string, val any) *QueryCond {
q.Cond(consts.Gt, column, val)
return q
}
// Ge 大于等于 >=
func (q *QueryCond) Ge(column string, val any) *QueryCond {
q.Cond(consts.Ge, column, val)
return q
}
// Lt 小于 <
func (q *QueryCond) Lt(column string, val any) *QueryCond {
q.Cond(consts.Lt, column, val)
return q
}
// Le 小于等于 <=
func (q *QueryCond) Le(column string, val any) *QueryCond {
q.Cond(consts.Le, column, val)
return q
}
func (q *QueryCond) Cond(cond, column string, val any) *QueryCond {
// 零值跳过
if utils.IsBlank(val) {
return q
}
q.columns = append(q.columns, fmt.Sprintf("%s %s ?", column, cond))
q.values = append(q.values, val)
return q
}