api2sql基础的能力 #8
							
								
								
									
										69
									
								
								base.go
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										69
									
								
								option.go
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								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<白茶清欢>
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user