Skip to content

Commit 0220223

Browse files
authored
feat: add nest query condition (#49)
1 parent c56e4e2 commit 0220223

File tree

3 files changed

+61
-77
lines changed

3 files changed

+61
-77
lines changed

gplus/dao.go

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,6 @@ func Delete[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
106106
return resultDb
107107
}
108108

109-
// DeleteByMap 根据Map删除记录
110-
func DeleteByMap[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
111-
db := getDb(opts...)
112-
for k, v := range q.ConditionMap {
113-
columnName := getColumnName(k)
114-
q.Eq(columnName, v)
115-
}
116-
var entity T
117-
resultDb := db.Where(q.queryBuilder.String(), q.queryArgs...).Delete(&entity)
118-
return resultDb
119-
}
120-
121109
// UpdateById 根据 ID 更新
122110
func UpdateById[T any](entity *T, opts ...OptionFunc) *gorm.DB {
123111
db := getDb(opts...)
@@ -297,28 +285,19 @@ func buildCondition[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
297285

298286
if q.queryBuilder.Len() > 0 {
299287

300-
if q.andBracketBuilder.Len() > 0 {
301-
q.queryArgs = append(q.queryArgs, q.andBracketArgs...)
302-
q.queryBuilder.WriteString(q.andBracketBuilder.String())
288+
if q.andNestBuilder.Len() > 0 {
289+
q.queryArgs = append(q.queryArgs, q.andNestArgs...)
290+
q.queryBuilder.WriteString(q.andNestBuilder.String())
303291
}
304292

305-
if q.orBracketBuilder.Len() > 0 {
306-
q.queryArgs = append(q.queryArgs, q.orBracketArgs...)
307-
q.queryBuilder.WriteString(q.orBracketBuilder.String())
293+
if q.orNestBuilder.Len() > 0 {
294+
q.queryArgs = append(q.queryArgs, q.orNestArgs...)
295+
q.queryBuilder.WriteString(q.orNestBuilder.String())
308296
}
309297

310298
resultDb.Where(q.queryBuilder.String(), q.queryArgs...)
311299
}
312300

313-
if len(q.ConditionMap) > 0 {
314-
var condMap = make(map[string]any)
315-
for k, v := range q.ConditionMap {
316-
columnName := getColumnName(k)
317-
condMap[columnName] = v
318-
}
319-
resultDb.Where(condMap)
320-
}
321-
322301
if q.orderBuilder.Len() > 0 {
323302
resultDb.Order(q.orderBuilder.String())
324303
}
@@ -330,6 +309,14 @@ func buildCondition[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
330309
if q.havingBuilder.Len() > 0 {
331310
resultDb.Having(q.havingBuilder.String(), q.havingArgs...)
332311
}
312+
313+
if q.limit != nil {
314+
resultDb.Limit(*q.limit)
315+
}
316+
317+
if q.offset != 0 {
318+
resultDb.Offset(q.offset)
319+
}
333320
}
334321
return resultDb
335322
}

gplus/option.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,9 @@ package gplus
2020
import "gorm.io/gorm"
2121

2222
type Option struct {
23-
Db *gorm.DB
24-
Selects []any
25-
Omits []any
26-
23+
Db *gorm.DB
24+
Selects []any
25+
Omits []any
2726
IgnoreTotal bool
2827
}
2928

gplus/query.go

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,22 @@ import (
2525
)
2626

2727
type QueryCond[T any] struct {
28-
selectColumns []string
29-
distinctColumns []string
30-
queryBuilder strings.Builder
31-
orBracketBuilder strings.Builder
32-
orBracketArgs []any
33-
andBracketBuilder strings.Builder
34-
andBracketArgs []any
35-
queryArgs []any
36-
orderBuilder strings.Builder
37-
groupBuilder strings.Builder
38-
havingBuilder strings.Builder
39-
havingArgs []any
40-
lastCond string
41-
updateMap map[string]any
42-
ConditionMap map[any]any
28+
selectColumns []string
29+
distinctColumns []string
30+
queryBuilder strings.Builder
31+
orNestBuilder strings.Builder
32+
orNestArgs []any
33+
andNestBuilder strings.Builder
34+
andNestArgs []any
35+
queryArgs []any
36+
orderBuilder strings.Builder
37+
groupBuilder strings.Builder
38+
havingBuilder strings.Builder
39+
havingArgs []any
40+
lastCond string
41+
limit *int
42+
offset int
43+
updateMap map[string]any
4344
}
4445

4546
// NewQuery 构建查询条件
@@ -83,21 +84,6 @@ func NewQueryModel[T any, R any]() (*QueryCond[T], *T, *R) {
8384
return q, t, r
8485
}
8586

86-
// NewQueryMap 构建Map查询条件
87-
func NewQueryMap[T any]() (*QueryCond[T], *T) {
88-
q := &QueryCond[T]{}
89-
90-
modelTypeStr := reflect.TypeOf((*T)(nil)).Elem().String()
91-
if model, ok := modelInstanceCache.Load(modelTypeStr); ok {
92-
return q, model.(*T)
93-
}
94-
m := new(T)
95-
Cache(m)
96-
97-
q.ConditionMap = make(map[any]any)
98-
return q, m
99-
}
100-
10187
// Eq 等于 =
10288
func (q *QueryCond[T]) Eq(column any, val any) *QueryCond[T] {
10389
q.addCond(column, val, constants.Eq)
@@ -223,35 +209,35 @@ func (q *QueryCond[T]) Distinct(columns ...any) *QueryCond[T] {
223209
}
224210

225211
// And 拼接 AND
226-
func (q *QueryCond[T]) And() *QueryCond[T] {
212+
func (q *QueryCond[T]) And(fn ...func(q *QueryCond[T])) *QueryCond[T] {
213+
if len(fn) > 0 {
214+
nestQuery := &QueryCond[T]{}
215+
fn[0](nestQuery)
216+
q.andNestBuilder.WriteString(constants.And + " " + constants.LeftBracket + nestQuery.queryBuilder.String() + constants.RightBracket + " ")
217+
q.andNestArgs = append(q.andNestArgs, nestQuery.queryArgs...)
218+
return q
219+
}
227220
q.queryBuilder.WriteString(constants.And)
228221
q.queryBuilder.WriteString(" ")
229222
q.lastCond = constants.And
230223
return q
231224
}
232225

233-
// AndBracket 拼接 AND,括号包裹条件
234-
func (q *QueryCond[T]) AndBracket(bracketQuery *QueryCond[T]) *QueryCond[T] {
235-
q.andBracketBuilder.WriteString(constants.And + " " + constants.LeftBracket + bracketQuery.queryBuilder.String() + constants.RightBracket + " ")
236-
q.andBracketArgs = append(q.andBracketArgs, bracketQuery.queryArgs...)
237-
return q
238-
}
239-
240226
// Or 拼接 OR
241-
func (q *QueryCond[T]) Or() *QueryCond[T] {
227+
func (q *QueryCond[T]) Or(fn ...func(q *QueryCond[T])) *QueryCond[T] {
228+
if len(fn) > 0 {
229+
nestQuery := &QueryCond[T]{}
230+
fn[0](nestQuery)
231+
q.orNestBuilder.WriteString(constants.Or + " " + constants.LeftBracket + nestQuery.queryBuilder.String() + constants.RightBracket + " ")
232+
q.orNestArgs = append(q.orNestArgs, nestQuery.queryArgs...)
233+
return q
234+
}
242235
q.queryBuilder.WriteString(constants.Or)
243236
q.queryBuilder.WriteString(" ")
244237
q.lastCond = constants.Or
245238
return q
246239
}
247240

248-
// OrBracket 拼接 OR,括号包裹条件
249-
func (q *QueryCond[T]) OrBracket(bracketQuery *QueryCond[T]) *QueryCond[T] {
250-
q.orBracketBuilder.WriteString(constants.Or + " " + constants.LeftBracket + bracketQuery.queryBuilder.String() + constants.RightBracket + " ")
251-
q.orBracketArgs = append(q.orBracketArgs, bracketQuery.queryArgs...)
252-
return q
253-
}
254-
255241
// Select 查询字段
256242
func (q *QueryCond[T]) Select(columns ...any) *QueryCond[T] {
257243
for _, v := range columns {
@@ -319,6 +305,18 @@ func (q *QueryCond[T]) Set(column any, val any) *QueryCond[T] {
319305
return q
320306
}
321307

308+
// Limit 指的查询记录数量
309+
func (q *QueryCond[T]) Limit(limit int) *QueryCond[T] {
310+
q.limit = &limit
311+
return q
312+
}
313+
314+
// Offset 指定跳过记录数量
315+
func (q *QueryCond[T]) Offset(offset int) *QueryCond[T] {
316+
q.offset = offset
317+
return q
318+
}
319+
322320
func (q *QueryCond[T]) addCond(column any, val any, condType string) {
323321
columnName := getColumnName(column)
324322
q.buildAndIfNeed()

0 commit comments

Comments
 (0)