diff --git a/base.go b/base.go index 0b20801..7fba777 100644 --- a/base.go +++ b/base.go @@ -199,7 +199,72 @@ func (b *BaseDao) setTxCondition(tx *gorm.DB, optionFuncList ...SetOption) *gorm tx = tx.Offset(o.Offset) } } - sqlBlockList := make([]string, 0) + // in 语句 + if nil != o.In { + tx = tx.Where(o.In) + } + + // not in 语句 + if nil != o.NotIn { + for field, value := range o.NotIn { + tx = tx.Where(field+" NOT IN ? ", value) + } + } + + // like 语句 + if nil != o.Like { + for field, value := range o.Like { + tx = tx.Where(field+" LIKE ? ", "%"+value+"%") + } + } + + // NOT LIKE 语句 + if nil != o.NotLike { + for field, value := range o.NotLike { + tx = tx.Where(field+" NOT LIKE ? ", "%"+value+"%") + } + } + + // >= + if nil != o.Start { + for field, value := range o.Start { + tx = tx.Where(field+" >= ?", value) + } + } + + // < + if nil != o.End { + for field, value := range o.End { + tx = tx.Where(field+" < ?", value) + } + } + + // between + for field, betweenVal := range o.Between { + tx = tx.Where("`"+field+"` BETWEEN ? AND ?", betweenVal[0], betweenVal[1]) + } + // not between + for field, notBetweenVal := range o.NotBetween { + tx = tx.Where("`"+field+"` NOT BETWEEN ? AND ?", notBetweenVal[0], notBetweenVal[1]) + } + + // 排序 + for _, orderRule := range o.Order { + tx = tx.Order(orderRule) + } + + // or 语句 + if nil != o.OR { + for _, itemOr := range o.OR { + orOption := &Option{} + for _, fn := range itemOr { + fn(orOption) + } + orSql, orBindVal := optionToSql(orOption) + tx.Or(orSql, orBindVal) + } + } + /*sqlBlockList := make([]string, 0) bindValueList := make([]any, 0) sql, bindVal := optionToSql(o) tx.Or(sql, bindVal...) @@ -212,6 +277,6 @@ func (b *BaseDao) setTxCondition(tx *gorm.DB, optionFuncList ...SetOption) *gorm } orSql, orBindVal := optionToSql(orOption) tx.Or(orSql, orBindVal...) - } + }*/ return tx } diff --git a/option.go b/option.go index a72046d..42e4a03 100644 --- a/option.go +++ b/option.go @@ -31,20 +31,22 @@ type SetOption func(o *Option) // // Date : 8:05 下午 2021/8/8 type Option struct { - Model any `json:"-"` // 操作model - Table string `json:"table"` // 查询的数据表 - Limit int `json:"limit"` // 限制数量 - Offset int `json:"offset"` // 偏移量 - In map[string]any `json:"in"` // in语句 - NotIn map[string]any `json:"not_in"` // not in语句 - Where map[string]any `json:"where"` // where 条件 - Start map[string]any `json:"start"` // >= 条件 - End map[string]any `json:"end"` // < 条件 - Like map[string]string `json:"like"` // like 语句 - NotLike map[string]string `json:"not_like"` // not like 语句 - NotEqual map[string]any `json:"not_equal"` // != 语句 - Order []string `json:"order"` // 排序规则 - OR [][]SetOption `json:"or"` // or 语句, or 和其他属性 and 关系, 内部 OR 关系 + Model any `json:"-"` // 操作model + Table string `json:"table"` // 查询的数据表 + Limit int `json:"limit"` // 限制数量 + Offset int `json:"offset"` // 偏移量 + In map[string]any `json:"in"` // in语句 + NotIn map[string]any `json:"not_in"` // not in语句 + Where map[string]any `json:"where"` // where 条件 + Between map[string][2]any `json:"between"` // between 条件 + NotBetween map[string][2]any `json:"not_between"` // not between 条件 + Start map[string]any `json:"start"` // >= 条件 + End map[string]any `json:"end"` // < 条件 + Like map[string]string `json:"like"` // like 语句 + NotLike map[string]string `json:"not_like"` // not like 语句 + NotEqual map[string]any `json:"not_equal"` // != 语句 + Order []string `json:"order"` // 排序规则 + OR [][]SetOption `json:"or"` // or 语句, or 和其他属性 and 关系, 内部 OR 关系 } // WithModel ... @@ -488,6 +490,17 @@ func optionToSql(o *Option) (sqlBuildResult string, bindValue []any) { bindValue = append(bindValue, fieldValue) } + // between + for field, betweenVal := range o.Between { + sqlBuildResultBlockList = append(sqlBuildResultBlockList, "`"+field+"` BETWEEN ? AND ?") + bindValue = append(bindValue, betweenVal[0], betweenVal[1]) + } + // not between + for field, notBetweenVal := range o.NotBetween { + sqlBuildResultBlockList = append(sqlBuildResultBlockList, "`"+field+"` NOT BETWEEN ? AND ?") + bindValue = append(bindValue, notBetweenVal[0], notBetweenVal[1]) + } + if len(bindValue) > 0 { sqlBuildResult = strings.Join(sqlBuildResultBlockList, " AND ") } @@ -513,6 +526,34 @@ func parseInSql(fieldValue any) (string, []any) { return strings.Join(placeholderList, ","), dataList } +// WithBetween between 语句 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 15:52 2024/8/23 +func WithBetween(field string, left any, right any) SetOption { + return func(o *Option) { + if nil == o.Between { + o.Between = map[string][2]any{} + } + o.Between[field] = [2]any{left, right} + } +} + +// WithNotBetween not between 语句 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 15:52 2024/8/23 +func WithNotBetween(field string, left any, right any) SetOption { + return func(o *Option) { + if nil == o.NotBetween { + o.NotBetween = map[string][2]any{} + } + o.NotBetween[field] = [2]any{left, right} + } +} + // WithAnyCondition 设置任意查询条件, 仅 where 子句 in / not in / like / not like / == / != // // Author : go_developer@163.com<白茶清欢>