fix some bug on extends find (#916)

This commit is contained in:
Lunny Xiao 2018-04-29 19:58:25 +08:00 committed by GitHub
parent d966376e44
commit e3550c7969
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 92 additions and 2 deletions

View File

@ -1091,7 +1091,25 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) {
pk := make([]interface{}, len(table.PrimaryKeys))
for i, col := range table.PKColumns() {
var err error
pkField := v.FieldByName(col.FieldName)
fieldName := col.FieldName
for {
parts := strings.SplitN(fieldName, ".", 2)
if len(parts) == 1 {
break
}
v = v.FieldByName(parts[0])
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
if v.Kind() != reflect.Struct {
return nil, ErrUnSupportedType
}
fieldName = parts[1]
}
fmt.Println(table.Name, fieldName, v)
pkField := v.FieldByName(fieldName)
switch pkField.Kind() {
case reflect.String:
pk[i], err = engine.idTypeAssertion(col, pkField.String())

View File

@ -655,5 +655,77 @@ func TestFindMapStringId(t *testing.T) {
cnt, err = testEngine.ID("1").Delete(new(FindMapDevice))
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
}
func TestFindExtends(t *testing.T) {
type FindExtendsB struct {
ID int64
}
type FindExtendsA struct {
FindExtendsB `xorm:"extends"`
}
assert.NoError(t, prepareEngine())
assertSync(t, new(FindExtendsA))
cnt, err := testEngine.Insert(&FindExtendsA{
FindExtendsB: FindExtendsB{},
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.Insert(&FindExtendsA{
FindExtendsB: FindExtendsB{},
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var results []FindExtendsA
err = testEngine.Find(&results)
assert.NoError(t, err)
assert.EqualValues(t, 2, len(results))
}
func TestFindExtends3(t *testing.T) {
type FindExtendsCC struct {
ID int64
Name string
}
type FindExtendsBB struct {
FindExtendsCC `xorm:"extends"`
}
type FindExtendsAA struct {
FindExtendsBB `xorm:"extends"`
}
assert.NoError(t, prepareEngine())
assertSync(t, new(FindExtendsAA))
cnt, err := testEngine.Insert(&FindExtendsAA{
FindExtendsBB: FindExtendsBB{
FindExtendsCC: FindExtendsCC{
Name: "cc1",
},
},
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
cnt, err = testEngine.Insert(&FindExtendsAA{
FindExtendsBB: FindExtendsBB{
FindExtendsCC: FindExtendsCC{
Name: "cc2",
},
},
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var results []FindExtendsAA
err = testEngine.Find(&results)
assert.NoError(t, err)
assert.EqualValues(t, 2, len(results))
}