From ca37557a26809b6089cb48a11e56b8c624ceebce Mon Sep 17 00:00:00 2001 From: gobenon Date: Thu, 19 Nov 2015 14:30:14 +0200 Subject: [PATCH 1/2] Update orm_querym2m.go --- orm/orm_querym2m.go | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/orm/orm_querym2m.go b/orm/orm_querym2m.go index 1eaccf72..1d8fea3e 100644 --- a/orm/orm_querym2m.go +++ b/orm/orm_querym2m.go @@ -44,7 +44,15 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { dbase := orm.alias.DbBaser var models []interface{} - + last_md_col_name := mi.fields.dbcols[len(mi.fields.dbcols)-1] + last_md := mds[len(mds)-1] + var v3 interface{} + var names []string + var values []interface{} + if reflect.Indirect(reflect.ValueOf(last_md)).Kind() != reflect.Struct { + v3 = (last_md) + mds = mds[:len(mds)-1] + } for _, md := range mds { val := reflect.ValueOf(md) if val.Kind() == reflect.Slice || val.Kind() == reflect.Array { @@ -63,15 +71,18 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { if exist == false { panic(ErrMissPK) } + if v3 != nil { + names = []string{mfi.column, rfi.column, last_md_col_name} - names := []string{mfi.column, rfi.column} - - values := make([]interface{}, 0, len(models)*2) + values = make([]interface{}, 0, len(models)*3) + } else { + names = []string{mfi.column, rfi.column} + values = make([]interface{}, 0, len(models)*2) + } for _, md := range models { ind := reflect.Indirect(reflect.ValueOf(md)) - var v2 interface{} if ind.Kind() != reflect.Struct { v2 = ind.Interface() @@ -81,14 +92,17 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { panic(ErrMissPK) } } - - values = append(values, v1, v2) + if v3 == nil { + values = append(values, v1, v2) + } else { + values = append(values, v1, v2, v3) + } } - return dbase.InsertValue(orm.db, mi, true, names, values) } + // remove models following the origin model relationship func (o *queryM2M) Remove(mds ...interface{}) (int64, error) { fi := o.fi From efd30bdba743923a533e0fc5441a25091596c629 Mon Sep 17 00:00:00 2001 From: gobenon Date: Thu, 19 Nov 2015 16:46:14 +0200 Subject: [PATCH 2/2] Update orm_querym2m.go --- orm/orm_querym2m.go | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/orm/orm_querym2m.go b/orm/orm_querym2m.go index 1d8fea3e..36c5e95f 100644 --- a/orm/orm_querym2m.go +++ b/orm/orm_querym2m.go @@ -44,14 +44,19 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { dbase := orm.alias.DbBaser var models []interface{} - last_md_col_name := mi.fields.dbcols[len(mi.fields.dbcols)-1] - last_md := mds[len(mds)-1] - var v3 interface{} - var names []string - var values []interface{} - if reflect.Indirect(reflect.ValueOf(last_md)).Kind() != reflect.Struct { - v3 = (last_md) - mds = mds[:len(mds)-1] + var other_values []interface{} + var other_names []string + + for _, colname := range mi.fields.dbcols { + if colname != mfi.column && colname != rfi.column && colname != fi.mi.fields.pk.column { + other_names = append(other_names, colname) + } + } + for i, md := range mds { + if reflect.Indirect(reflect.ValueOf(md)).Kind() != reflect.Struct && i > 0 { + other_values = append(other_values, md) + mds = append(mds[:i], mds[i+1:]...) + } } for _, md := range mds { val := reflect.ValueOf(md) @@ -71,15 +76,10 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { if exist == false { panic(ErrMissPK) } - if v3 != nil { - names = []string{mfi.column, rfi.column, last_md_col_name} - values = make([]interface{}, 0, len(models)*3) - } else { - names = []string{mfi.column, rfi.column} + names := []string{mfi.column, rfi.column} - values = make([]interface{}, 0, len(models)*2) - } + values := make([]interface{}, 0, len(models)*2) for _, md := range models { ind := reflect.Indirect(reflect.ValueOf(md)) @@ -92,17 +92,14 @@ func (o *queryM2M) Add(mds ...interface{}) (int64, error) { panic(ErrMissPK) } } - if v3 == nil { - values = append(values, v1, v2) - } else { - values = append(values, v1, v2, v3) - } + values = append(values, v1, v2) } + names = append(names, other_names...) + values = append(values, other_values...) return dbase.InsertValue(orm.db, mi, true, names, values) } - // remove models following the origin model relationship func (o *queryM2M) Remove(mds ...interface{}) (int64, error) { fi := o.fi