From f2a1e6ea2ffafe217fd6aa5d9924be907458f550 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 22 Jul 2021 15:17:38 +0800 Subject: [PATCH] Fix test --- integrations/session_associate_test.go | 2 +- session_associate.go | 71 +++++++++++++++++++------- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/integrations/session_associate_test.go b/integrations/session_associate_test.go index 3386bef1..9406d996 100644 --- a/integrations/session_associate_test.go +++ b/integrations/session_associate_test.go @@ -169,7 +169,7 @@ func TestBelongsTo_Find(t *testing.T) { assert.Equal(t, "face1", noses2[0].Face.Name) assert.Equal(t, "face2", noses2[1].Face.Name) - err = testEngine.Load(noses1, "face") + err = testEngine.Load(noses1, "face_id") assert.NoError(t, err) assert.Equal(t, "face1", noses1[0].Face.Name) assert.Equal(t, "face2", noses1[1].Face.Name) diff --git a/session_associate.go b/session_associate.go index 2951b6fc..3877d89a 100644 --- a/session_associate.go +++ b/session_associate.go @@ -6,6 +6,7 @@ package xorm import ( "errors" + "fmt" "reflect" "xorm.io/xorm/internal/utils" @@ -56,44 +57,76 @@ func (session *Session) loadFindSlice(v reflect.Value, cols ...string) error { return err } - var pks = make(map[*schemas.Column][]interface{}) + type Va struct { + v reflect.Value + pk []interface{} + col *schemas.Column + } + + var pks = make(map[*schemas.Column]*Va) for i := 0; i < v.Len(); i++ { ev := v.Index(i) + fmt.Println("1====", ev.Interface(), tb.Name, len(tb.Columns())) + for _, col := range tb.Columns() { + fmt.Println("====", cols, col.Name) if len(cols) > 0 && !isStringInSlice(col.Name, cols) { continue } - if col.AssociateTable != nil { - if col.AssociateType == schemas.AssociateBelongsTo { - colV, err := col.ValueOfV(&ev) - if err != nil { - return err - } + fmt.Println("3------", col.Name, col.AssociateTable) - vv := colV.Interface() - /*var colPtr reflect.Value - if colV.Kind() == reflect.Ptr { - colPtr = *colV - } else { - colPtr = colV.Addr() - }*/ + if col.AssociateTable == nil || col.AssociateType != schemas.AssociateBelongsTo { + continue + } - if !utils.IsZero(vv) { - pks[col] = append(pks[col], vv) + colV, err := col.ValueOfV(&ev) + if err != nil { + return err + } + + pkCols := col.AssociateTable.PKColumns() + pkV, err := pkCols[0].ValueOfV(colV) + if err != nil { + return err + } + vv := pkV.Interface() + + fmt.Println("2====", vv) + + if !utils.IsZero(vv) { + va, ok := pks[col] + if !ok { + va = &Va{ + v: ev, + col: pkCols[0], } + pks[col] = va } + va.pk = append(va.pk, vv) } } } - for col, pk := range pks { - slice := reflect.MakeSlice(col.FieldType, 0, len(pk)) - err = session.In(col.Name, pk...).find(slice.Addr().Interface()) + for col, va := range pks { + slice := reflect.MakeSlice(reflect.SliceOf(col.FieldType), 0, len(va.pk)) + err = session.In(va.col.Name, va.pk...).find(slice.Interface()) if err != nil { return err } + + /*vv, err := col.ValueOfV(&va.v) + if err != nil { + return err + } + vv.Set() + + for i := 0; i < slice.Len(); i++ { + + + va.col.ValueOfV(slice.Index(i)) + }*/ } return nil }