diff --git a/g/database/gdb/gdb_model.go b/g/database/gdb/gdb_model.go index b9168016f..ef61c8041 100644 --- a/g/database/gdb/gdb_model.go +++ b/g/database/gdb/gdb_model.go @@ -511,21 +511,18 @@ func (md *Model) Structs(objPointerSlice interface{}) error { // 链式操作,将结果转换为指定的struct/*struct/[]struct/[]*struct, // 参数应该为指针类型,否则返回失败。 // 该方法自动识别参数类型,调用Struct/Structs方法。 -func (md *Model) Scan(objPointer interface{}) error { - t := reflect.TypeOf(objPointer) +func (md *Model) Scan(pointer interface{}) error { + t := reflect.TypeOf(pointer) k := t.Kind() if k != reflect.Ptr { return fmt.Errorf("params should be type of pointer, but got: %v", k) } - k = t.Elem().Kind() - switch k { + switch t.Elem().Kind() { case reflect.Array: case reflect.Slice: - return md.Structs(objPointer) - case reflect.Struct: - return md.Struct(objPointer) + return md.Structs(pointer) default: - return fmt.Errorf("element type should be type of struct/slice, unsupported: %v", k) + return md.Struct(pointer) } return nil } diff --git a/g/database/gdb/gdb_unit_model_test.go b/g/database/gdb/gdb_unit_model_test.go index 2c438492b..1daf31db4 100644 --- a/g/database/gdb/gdb_unit_model_test.go +++ b/g/database/gdb/gdb_unit_model_test.go @@ -358,7 +358,7 @@ func TestModel_Struct(t *testing.T) { gtest.Assert(user.NickName, "T111") gtest.Assert(user.CreateTime.String(), "2018-10-10 00:01:10") }) - + // Auto creating struct object. gtest.Case(t, func() { type User struct { Id int @@ -375,6 +375,23 @@ func TestModel_Struct(t *testing.T) { gtest.Assert(user.NickName, "T111") gtest.Assert(user.CreateTime.String(), "2018-10-10 00:01:10") }) + // Just using Scan. + gtest.Case(t, func() { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + user := (*User)(nil) + err := db.Table("user").Where("id=1").Scan(&user) + if err != nil { + gtest.Fatal(err) + } + gtest.Assert(user.NickName, "T111") + gtest.Assert(user.CreateTime.String(), "2018-10-10 00:01:10") + }) gtest.Case(t, func() { type User struct { @@ -436,7 +453,29 @@ func TestModel_Structs(t *testing.T) { gtest.Assert(users[2].NickName, "T3") gtest.Assert(users[0].CreateTime.String(), "2018-10-10 00:01:10") }) - + // Just using Scan. + gtest.Case(t, func() { + type User struct { + Id int + Passport string + Password string + NickName string + CreateTime *gtime.Time + } + var users []*User + err := db.Table("user").OrderBy("id asc").Scan(&users) + if err != nil { + gtest.Fatal(err) + } + gtest.Assert(len(users), 3) + gtest.Assert(users[0].Id, 1) + gtest.Assert(users[1].Id, 2) + gtest.Assert(users[2].Id, 3) + gtest.Assert(users[0].NickName, "T111") + gtest.Assert(users[1].NickName, "T2") + gtest.Assert(users[2].NickName, "T3") + gtest.Assert(users[0].CreateTime.String(), "2018-10-10 00:01:10") + }) gtest.Case(t, func() { type User struct { Id int diff --git a/geg/util/gconv/gconv_struct_create.go b/geg/util/gconv/gconv_struct_create.go new file mode 100644 index 000000000..54d22e54d --- /dev/null +++ b/geg/util/gconv/gconv_struct_create.go @@ -0,0 +1,23 @@ +package main + +import ( + "github.com/gogf/gf/g" + "github.com/gogf/gf/g/util/gconv" +) + +func main() { + type User struct { + Uid int + Name string + } + user := (*User)(nil) + params := g.Map{ + "uid": 1, + "name": "john", + } + err := gconv.Struct(params, &user) + if err != nil { + panic(err) + } + g.Dump(user) +}