This commit is contained in:
tangpanqing
2023-01-06 07:12:36 +08:00
parent 0cac8714dc
commit 9beffba8ed
5 changed files with 21 additions and 9 deletions

View File

@@ -16,6 +16,11 @@ type FieldInfo struct {
Name string Name string
} }
type GroupItem struct {
Prefix string
Field interface{}
}
type WhereItem struct { type WhereItem struct {
FuncName string FuncName string
Prefix string Prefix string

View File

@@ -51,7 +51,7 @@ type Builder struct {
tableName string tableName string
selectList []SelectItem selectList []SelectItem
selectExpList []*SelectItem selectExpList []*SelectItem
groupList []interface{} groupList []GroupItem
whereList []WhereItem whereList []WhereItem
joinList []JoinItem joinList []JoinItem
havingList []WhereItem havingList []WhereItem
@@ -568,8 +568,11 @@ func (b *Builder) Table(table interface{}, alias ...string) *Builder {
} }
// GroupBy 链式操作,以某字段进行分组 // GroupBy 链式操作,以某字段进行分组
func (ex *Builder) GroupBy(fieldName interface{}) *Builder { func (ex *Builder) GroupBy(field interface{}, prefix ...string) *Builder {
ex.groupList = append(ex.groupList, fieldName) ex.groupList = append(ex.groupList, GroupItem{
Prefix: getPrefixByField(field, prefix...),
Field: field,
})
return ex return ex
} }
@@ -608,7 +611,11 @@ func (ex *Builder) LockForUpdate(isLockForUpdate bool) *Builder {
func (ex *Builder) whereAndHaving(where []WhereItem, paramList []any) ([]string, []any) { func (ex *Builder) whereAndHaving(where []WhereItem, paramList []any) ([]string, []any) {
var whereList []string var whereList []string
for i := 0; i < len(where); i++ { for i := 0; i < len(where); i++ {
allFieldName := where[i].Prefix + "." + getFieldName(where[i].Field) allFieldName := ""
if where[i].Prefix != "" {
allFieldName += where[i].Prefix + "."
}
allFieldName += getFieldName(where[i].Field)
if where[i].FuncName != "" { if where[i].FuncName != "" {
allFieldName = where[i].FuncName + "(" + allFieldName + ")" allFieldName = where[i].FuncName + "(" + allFieldName + ")"
} }

View File

@@ -117,7 +117,7 @@ func (ex *Builder) handleGroup(paramList []any) (string, []any) {
var groupList []string var groupList []string
for i := 0; i < len(ex.groupList); i++ { for i := 0; i < len(ex.groupList); i++ {
groupList = append(groupList, getFieldName(ex.groupList[i])) groupList = append(groupList, ex.groupList[i].Prefix+"."+getFieldName(ex.groupList[i].Field))
} }
return " GROUP BY " + strings.Join(groupList, ","), paramList return " GROUP BY " + strings.Join(groupList, ","), paramList

View File

@@ -55,10 +55,10 @@ func (ex *Builder) HavingNe(funcName string, field interface{}, val interface{},
return ex return ex
} }
func (ex *Builder) HavingGt(funcName string, field interface{}, val interface{}, prefix ...string) *Builder { func (ex *Builder) HavingGt(field interface{}, val interface{}, prefix ...string) *Builder {
ex.havingList = append(ex.havingList, WhereItem{ ex.havingList = append(ex.havingList, WhereItem{
FuncName: funcName, FuncName: "",
Prefix: getPrefixByField(field, prefix...), Prefix: "",
Field: field, Field: field,
Opt: Gt, Opt: Gt,
Val: val, Val: val,

View File

@@ -461,7 +461,7 @@ func testHaving(driver string, db *sql.DB) {
GroupBy(&person.Age). GroupBy(&person.Age).
WhereEq(&person.Type, 0). WhereEq(&person.Type, 0).
OrderBy(&person.Age, builder.Desc). OrderBy(&person.Age, builder.Desc).
HavingGt(builder.Count, &person.Age, 4). HavingGt(&personAge.AgeCount, 4).
GetMany(&listByHaving) GetMany(&listByHaving)
if err != nil { if err != nil {
panic(driver + " testHaving " + "found err") panic(driver + " testHaving " + "found err")