From 8f4bd6de9713d9d80f330acde84e54e8ee7f948f Mon Sep 17 00:00:00 2001 From: fizzday Date: Thu, 22 Aug 2019 15:45:18 +0800 Subject: [PATCH] modify value&pluck return type --- orm_query.go | 43 +++++++++++++++++++++--------------------- orm_query_interface.go | 6 ++---- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/orm_query.go b/orm_query.go index 0fc622f..3d9e6dd 100644 --- a/orm_query.go +++ b/orm_query.go @@ -109,46 +109,46 @@ func (dba *Orm) _unionBuild(union, field string) (interface{}, error) { } // Get : select more rows , relation limit set -func (dba *Orm) Value(field string) (v t.T, err error) { +func (dba *Orm) Value(field string) (v interface{}, err error) { dba.Limit(1) err = dba.Select() if err != nil { return } - //var binder = dba.GetISession().GetIBinder() - //switch binder.GetBindType() { - //case OBJECT_MAP, OBJECT_MAP_SLICE, OBJECT_MAP_SLICE_T, OBJECT_MAP_T: - // v = t.New(binder.GetBindResult().MapIndex(reflect.ValueOf(field)).Interface()) - //case OBJECT_STRUCT, OBJECT_STRUCT_SLICE: - // bindResult := reflect.Indirect(binder.GetBindResult()) - // v = dba._valueFromStruct(bindResult, field) - //} + var binder = dba.GetISession().GetIBinder() + switch binder.GetBindType() { + case OBJECT_MAP, OBJECT_MAP_SLICE, OBJECT_MAP_SLICE_T, OBJECT_MAP_T: + v = reflect.ValueOf(binder.GetBindResult()).MapIndex(reflect.ValueOf(field)).Interface() + case OBJECT_STRUCT, OBJECT_STRUCT_SLICE: + bindResult := reflect.Indirect(reflect.ValueOf(binder.GetBindResult())) + v = dba._valueFromStruct(bindResult, field) + } return } -func (dba *Orm) _valueFromStruct(bindResult reflect.Value, field string) (v t.T) { +func (dba *Orm) _valueFromStruct(bindResult reflect.Value, field string) (v interface{}) { ostype := bindResult.Type() for i := 0; i < ostype.NumField(); i++ { tag := ostype.Field(i).Tag.Get(TAGNAME) if tag == field || ostype.Field(i).Name == field { - v = t.New(bindResult.FieldByName(ostype.Field(i).Name)) + v = bindResult.FieldByName(ostype.Field(i).Name).Interface() } } return } // Pluck 获取一列数据, 第二个字段可以指定另一个字段的值作为这一列数据的key -func (dba *Orm) Pluck(field string, fieldKey ...string) (v t.T, err error) { +func (dba *Orm) Pluck(field string, fieldKey ...string) (v interface{}, err error) { err = dba.Select() if err != nil { return } var binder = dba.GetISession().GetIBinder() - var resMap = make(t.MapStringInterface, 0) - var resSlice = t.Slice{} + var resMap = make(map[interface{}]interface{}, 0) + var resSlice = make([]interface{}, 0) switch binder.GetBindType() { case OBJECT_MAP, OBJECT_MAP_T, OBJECT_STRUCT: // row - var key, val t.T + var key, val interface{} if len(fieldKey) > 0 { key, err = dba.Value(fieldKey[0]) if err != nil { @@ -158,21 +158,20 @@ func (dba *Orm) Pluck(field string, fieldKey ...string) (v t.T, err error) { if err != nil { return } - v = t.New(t.Map{key: val}) + resMap[key] = val } else { v, err = dba.Value(field) if err != nil { return } } - return case OBJECT_MAP_SLICE, OBJECT_MAP_SLICE_T: for _, item := range t.New(binder.GetBindResultSlice().Interface()).Slice() { val := item.MapInterface() if len(fieldKey) > 0 { - resMap[val[fieldKey[0]].String()] = val[field] + resMap[val[fieldKey[0]].Interface()] = val[field].Interface() } else { - resSlice = append(resSlice, val[field]) + resSlice = append(resSlice, val[field].Interface()) } } case OBJECT_STRUCT_SLICE: // rows @@ -182,16 +181,16 @@ func (dba *Orm) Pluck(field string, fieldKey ...string) (v t.T, err error) { if len(fieldKey) > 0 { mapkey := dba._valueFromStruct(val, fieldKey[0]) mapVal := dba._valueFromStruct(val, field) - resMap[mapkey.String()] = mapVal + resMap[mapkey] = mapVal } else { resSlice = append(resSlice, dba._valueFromStruct(val, field)) } } } if len(fieldKey) > 0 { - v = t.New(t.New(resMap).Map()) + v = resMap } else { - v = t.New(resSlice) + v = resSlice } return } diff --git a/orm_query_interface.go b/orm_query_interface.go index 29e53ab..ffa13b6 100644 --- a/orm_query_interface.go +++ b/orm_query_interface.go @@ -1,7 +1,5 @@ package gorose -import "github.com/gohouse/t" - type IOrmQuery interface { // 获取数据, 依据传入的绑定对象, 选择查询一条或多条数据并绑定到传入对象上 // 当绑定对象传入的是string类型时, 返回多条结果集, 需要使用 Get() 来获取最终结果 @@ -11,10 +9,10 @@ type IOrmQuery interface { // 获取多条结果并返回, 只有当传入的table对象是字符串时生效 Get() ([]Data, error) // 如果你不需要完整的一行,可以使用 value 方法从结果中获取单个值,该方法会直接返回指定列的值: - Value(field string) (v t.T, err error) + Value(field string) (v interface{}, err error) // 如果想要获取包含单个列值的数组,可以使用 pluck 方法 // 还可以在返回数组中为列值指定自定义键(该自定义键必须是该表的其它字段列名,否则会报错) - Pluck(field string, fieldKey ...string) (v t.T, err error) + Pluck(field string, fieldKey ...string) (v interface{}, err error) // 查询构建器还提供了多个聚合方法,如count, max, min, avg 和 sum,你可以在构造查询之后调用这些方法: Count(args ...string) (int64, error) Sum(sum string) (interface{}, error)