Merge branch 'develop' of https://github.com/astaxie/beego into develop
This commit is contained in:
		
						commit
						7747e9ec8b
					
				| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user