Skip to content

Commit

Permalink
modify value&pluck return type
Browse files Browse the repository at this point in the history
  • Loading branch information
fizzday committed Aug 22, 2019
1 parent 2365cb6 commit 8f4bd6d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 26 deletions.
43 changes: 21 additions & 22 deletions orm_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand All @@ -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
}
Expand Down
6 changes: 2 additions & 4 deletions orm_query_interface.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package gorose

import "github.com/gohouse/t"

type IOrmQuery interface {
// 获取数据, 依据传入的绑定对象, 选择查询一条或多条数据并绑定到传入对象上
// 当绑定对象传入的是string类型时, 返回多条结果集, 需要使用 Get() 来获取最终结果
Expand All @@ -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)
Expand Down

0 comments on commit 8f4bd6d

Please sign in to comment.