mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-03 16:00:25 +08:00
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
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 {
|
|
return q.GenGdbWithDb(global.Db)
|
|
}
|
|
|
|
func (q *Query) GenGdbWithDb(db *gorm.DB) *gorm.DB {
|
|
var gdb *gorm.DB
|
|
if q.table != "" {
|
|
gdb = db.Table(q.table)
|
|
} else {
|
|
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
|
|
}
|