api2sql基础的能力 #8

Merged
zhangdeman merged 26 commits from feature/api2sql into master 2024-08-24 12:33:47 +08:00
2 changed files with 122 additions and 16 deletions
Showing only changes of commit 1071c7558e - Show all commits

69
base.go
View File

@ -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
}

View File

@ -38,6 +38,8 @@ type Option struct {
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 语句
@ -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<白茶清欢>