mirror of
https://github.com/astaxie/beego.git
synced 2024-11-22 17:00:55 +00:00
Merge pull request #2637 from alexsunxl/develop
allow o.Raw(sql).QueryRows(&container) pass nested struct
This commit is contained in:
commit
9765519f38
@ -493,19 +493,33 @@ func (o *rawSet) QueryRows(containers ...interface{}) (int64, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for i := 0; i < ind.NumField(); i++ {
|
// define recursive function
|
||||||
f := ind.Field(i)
|
var recursiveSetField func(rv reflect.Value)
|
||||||
fe := ind.Type().Field(i)
|
recursiveSetField = func(rv reflect.Value) {
|
||||||
_, tags := parseStructTag(fe.Tag.Get(defaultStructTagName))
|
for i := 0; i < rv.NumField(); i++ {
|
||||||
var col string
|
f := rv.Field(i)
|
||||||
if col = tags["column"]; col == "" {
|
fe := rv.Type().Field(i)
|
||||||
col = snakeString(fe.Name)
|
|
||||||
}
|
// check if the field is a Struct
|
||||||
if v, ok := columnsMp[col]; ok {
|
// recursive the Struct type
|
||||||
value := reflect.ValueOf(v).Elem().Interface()
|
if fe.Type.Kind() == reflect.Struct {
|
||||||
o.setFieldValue(f, value)
|
recursiveSetField(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
_, tags := parseStructTag(fe.Tag.Get(defaultStructTagName))
|
||||||
|
var col string
|
||||||
|
if col = tags["column"]; col == "" {
|
||||||
|
col = snakeString(fe.Name)
|
||||||
|
}
|
||||||
|
if v, ok := columnsMp[col]; ok {
|
||||||
|
value := reflect.ValueOf(v).Elem().Interface()
|
||||||
|
o.setFieldValue(f, value)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// init call the recursive function
|
||||||
|
recursiveSetField(ind)
|
||||||
}
|
}
|
||||||
|
|
||||||
if eTyps[0].Kind() == reflect.Ptr {
|
if eTyps[0].Kind() == reflect.Ptr {
|
||||||
|
@ -1661,6 +1661,13 @@ func TestRawQueryRow(t *testing.T) {
|
|||||||
throwFail(t, AssertIs(pid, nil))
|
throwFail(t, AssertIs(pid, nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// user_profile table
|
||||||
|
type userProfile struct {
|
||||||
|
User
|
||||||
|
Age int
|
||||||
|
Money float64
|
||||||
|
}
|
||||||
|
|
||||||
func TestQueryRows(t *testing.T) {
|
func TestQueryRows(t *testing.T) {
|
||||||
Q := dDbBaser.TableQuote()
|
Q := dDbBaser.TableQuote()
|
||||||
|
|
||||||
@ -1731,6 +1738,19 @@ func TestQueryRows(t *testing.T) {
|
|||||||
throwFailNow(t, AssertIs(usernames[1], "astaxie"))
|
throwFailNow(t, AssertIs(usernames[1], "astaxie"))
|
||||||
throwFailNow(t, AssertIs(ids[2], 4))
|
throwFailNow(t, AssertIs(ids[2], 4))
|
||||||
throwFailNow(t, AssertIs(usernames[2], "nobody"))
|
throwFailNow(t, AssertIs(usernames[2], "nobody"))
|
||||||
|
|
||||||
|
//test query rows by nested struct
|
||||||
|
var l []userProfile
|
||||||
|
query = fmt.Sprintf("SELECT * FROM %suser_profile%s LEFT JOIN %suser%s ON %suser_profile%s.%sid%s = %suser%s.%sid%s", Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q, Q)
|
||||||
|
num, err = dORM.Raw(query).QueryRows(&l)
|
||||||
|
throwFailNow(t, err)
|
||||||
|
throwFailNow(t, AssertIs(num, 2))
|
||||||
|
throwFailNow(t, AssertIs(len(l), 2))
|
||||||
|
throwFailNow(t, AssertIs(l[0].UserName, "slene"))
|
||||||
|
throwFailNow(t, AssertIs(l[0].Age, 28))
|
||||||
|
throwFailNow(t, AssertIs(l[1].UserName, "astaxie"))
|
||||||
|
throwFailNow(t, AssertIs(l[1].Age, 30))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestRawValues(t *testing.T) {
|
func TestRawValues(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user