Fix load slice

This commit is contained in:
Lunny Xiao 2021-08-11 14:09:26 +08:00
parent 6dc2f9eec7
commit 59521246d3
1 changed files with 38 additions and 47 deletions

View File

@ -48,40 +48,45 @@ func (session *Session) loadFindSlice(v reflect.Value, cols ...string) error {
return nil return nil
} }
vv := v.Index(0) tableValue := v.Index(0)
if vv.Kind() == reflect.Ptr { if tableValue.Kind() == reflect.Ptr {
vv = vv.Elem() tableValue = tableValue.Elem()
} }
tb, err := session.engine.tagParser.ParseWithCache(vv) tb, err := session.engine.tagParser.ParseWithCache(tableValue)
if err != nil { if err != nil {
return err return err
} }
type Va struct { type Va struct {
v reflect.Value v []reflect.Value
pk []interface{} pk []interface{}
col *schemas.Column col *schemas.Column
} }
var pks = make(map[*schemas.Column]*Va) var pks = make(map[*schemas.Column]*Va)
for _, col := range tb.Columns() {
if col.AssociateTable == nil || col.AssociateType != schemas.AssociateBelongsTo {
continue
}
if len(cols) > 0 && !isStringInSlice(col.Name, cols) {
continue
}
pkCols := col.AssociateTable.PKColumns()
if len(pkCols) != 1 {
return fmt.Errorf("unsupported primary key number")
}
pks[col] = &Va{
col: pkCols[0],
}
}
for i := 0; i < v.Len(); i++ { for i := 0; i < v.Len(); i++ {
ev := v.Index(i) value := v.Index(i)
for col, va := range pks {
fmt.Println("1====", ev.Interface(), tb.Name, len(tb.Columns())) colV, err := col.ValueOfV(&value)
for _, col := range tb.Columns() {
fmt.Println("====", cols, col.Name)
if len(cols) > 0 && !isStringInSlice(col.Name, cols) {
continue
}
fmt.Println("3------", col.Name, col.AssociateTable)
if col.AssociateTable == nil || col.AssociateType != schemas.AssociateBelongsTo {
continue
}
colV, err := col.ValueOfV(&ev)
if err != nil { if err != nil {
return err return err
} }
@ -92,47 +97,33 @@ func (session *Session) loadFindSlice(v reflect.Value, cols ...string) error {
return err return err
} }
vv := pkV.Interface() vv := pkV.Interface()
if !utils.IsZero(vv) { // TODO: duplicate primary key
fmt.Println("2====", vv) va.v = append(va.v, *colV)
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) va.pk = append(va.pk, vv)
} }
} }
} }
for col, va := range pks { for col, va := range pks {
//slice := reflect.New(reflect.SliceOf(col.FieldType))
pkCols := col.AssociateTable.PKColumns() pkCols := col.AssociateTable.PKColumns()
if len(pkCols) != 1 {
return fmt.Errorf("unsupported primary key number")
}
mp := reflect.MakeMap(reflect.MapOf(pkCols[0].FieldType, col.FieldType)) mp := reflect.MakeMap(reflect.MapOf(pkCols[0].FieldType, col.FieldType))
//slice := reflect.MakeSlice(, 0, len(va.pk)) x := reflect.New(mp.Type())
err = session.In(va.col.Name, va.pk...).find(mp.Addr().Interface()) x.Elem().Set(mp)
err = session.In(va.col.Name, va.pk...).find(x.Interface())
if err != nil { if err != nil {
return err return err
} }
/*vv, err := col.ValueOfV(&va.v) for _, v := range va.v {
pkCols := col.AssociateTable.PKColumns()
pkV, err := pkCols[0].ValueOfV(&v)
if err != nil { if err != nil {
return err return err
} }
vv.Set()
for i := 0; i < slice.Len(); i++ { v.Set(mp.MapIndex(*pkV))
}
va.col.ValueOfV(slice.Index(i))
}*/
} }
return nil return nil
} }