Fix load slice
This commit is contained in:
parent
6dc2f9eec7
commit
59521246d3
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue