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

89 lines
1.7 KiB
Go
Raw Normal View History

package gormx
import (
"mayfly-go/pkg/global"
"mayfly-go/pkg/model"
"strings"
"gorm.io/gorm"
)
type Query struct {
dbModel any // 数据库模型
table string
joins string // join 类似 left join emails on emails.user_id = users.id
cond *model.QueryCond // 条件
}
// NewQuery 构建查询条件
func NewQuery(dbModel any, cond *model.QueryCond) *Query {
return &Query{dbModel: dbModel, cond: cond}
}
func NewQueryWithTableName(tableName string) *Query {
return &Query{table: tableName}
}
func (q *Query) WithCond(cond *model.QueryCond) *Query {
q.cond = cond
return q
}
func (q *Query) Joins(joins string) *Query {
q.joins = joins
return q
}
// 添加未删除数据过滤条件(适用于单表用实体查询)
func (q *Query) Undeleted() *Query {
// 存在表名,则可能为关联查询等,需要自行设置未删除条件过滤
if q.table != "" {
return q
}
q.cond.Eq0(model.DeletedColumn, model.ModelUndeleted)
return q
}
func (q *Query) GenGdb() *gorm.DB {
2023-12-27 22:59:20 +08:00
return q.GenGdbWithDb(global.Db)
}
func (q *Query) GenGdbWithDb(db *gorm.DB) *gorm.DB {
var gdb *gorm.DB
if q.table != "" {
2023-12-27 22:59:20 +08:00
gdb = db.Table(q.table)
} else {
2023-12-27 22:59:20 +08:00
gdb = db.Model(q.dbModel)
}
cond := q.cond
if len(cond.GetSelectColumns()) > 0 {
gdb.Select(cond.GetSelectColumns())
}
if q.joins != "" {
gdb.Joins(q.joins)
}
setGdbWhere(gdb, cond)
if len(cond.GetOrderBy()) > 0 {
gdb.Order(strings.Join(cond.GetOrderBy(), ","))
} else {
gdb.Order("id desc")
}
return gdb
}
func setGdbWhere(gdb *gorm.DB, cond *model.QueryCond) *gorm.DB {
if cond.GetCondModel() != nil {
gdb.Where(cond.GetCondModel())
}
for i, v := range cond.GetWheres() {
gdb.Where(i, v...)
}
return gdb
}