forked from mirror/gorm
62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
|
package gorm
|
||
|
|
||
|
import "reflect"
|
||
|
|
||
|
func (scope *Scope) getColumnAsArray(columns []string) (results [][]interface{}) {
|
||
|
indirectScopeValue := scope.IndirectValue()
|
||
|
switch indirectScopeValue.Kind() {
|
||
|
case reflect.Slice:
|
||
|
for i := 0; i < indirectScopeValue.Len(); i++ {
|
||
|
var result []interface{}
|
||
|
var object = reflect.Indirect(indirectScopeValue.Index(i))
|
||
|
for _, column := range columns {
|
||
|
result = append(result, object.FieldByName(column).Interface())
|
||
|
}
|
||
|
results = append(results, result)
|
||
|
}
|
||
|
case reflect.Struct:
|
||
|
var result []interface{}
|
||
|
for _, column := range columns {
|
||
|
result = append(result, indirectScopeValue.FieldByName(column).Interface())
|
||
|
}
|
||
|
return [][]interface{}{result}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (scope *Scope) getColumnAsScope(column string) *Scope {
|
||
|
indirectScopeValue := scope.IndirectValue()
|
||
|
|
||
|
switch indirectScopeValue.Kind() {
|
||
|
case reflect.Slice:
|
||
|
if fieldStruct, ok := scope.GetModelStruct().ModelType.FieldByName(column); ok {
|
||
|
fieldType := fieldStruct.Type
|
||
|
if fieldType.Kind() == reflect.Slice || fieldType.Kind() == reflect.Ptr {
|
||
|
fieldType = fieldType.Elem()
|
||
|
}
|
||
|
|
||
|
results := reflect.New(reflect.SliceOf(reflect.PtrTo(fieldType))).Elem()
|
||
|
|
||
|
for i := 0; i < indirectScopeValue.Len(); i++ {
|
||
|
result := reflect.Indirect(reflect.Indirect(indirectScopeValue.Index(i)).FieldByName(column))
|
||
|
|
||
|
if result.Kind() == reflect.Slice {
|
||
|
for j := 0; j < result.Len(); j++ {
|
||
|
if elem := result.Index(j); elem.CanAddr() {
|
||
|
results = reflect.Append(results, elem.Addr())
|
||
|
}
|
||
|
}
|
||
|
} else if result.CanAddr() {
|
||
|
results = reflect.Append(results, result.Addr())
|
||
|
}
|
||
|
}
|
||
|
return scope.New(results.Interface())
|
||
|
}
|
||
|
case reflect.Struct:
|
||
|
if field := indirectScopeValue.FieldByName(column); field.CanAddr() {
|
||
|
return scope.New(field.Addr().Interface())
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|