-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmany_to_many.go
56 lines (49 loc) · 1.21 KB
/
many_to_many.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package gorprel
import sq "github.com/Masterminds/squirrel"
type Mapping interface {
Model
OtherModel(Model) Model
OtherKey(Model) interface{}
}
func (d *DbMap) ManyToManyBuilder(m Model, mapping Mapping, selectStr string) (sq.SelectBuilder, error) {
var slct string
slct = selectStr
if selectStr == "" {
slct = "*"
}
other := mapping.OtherModel(m)
kname := m.KeyName()
k := m.Key()
w := sq.Select("*").From(d.TableName(mapping)).Where(sq.Eq{kname: k})
rows, err := d.Query(mapping, w)
if err != nil {
return sq.SelectBuilder{}, err
}
keys := make([]interface{}, 0)
for _, r := range rows {
if itr, ok := r.(Mapping); ok {
keys = append(keys, itr.OtherKey(m))
}
}
kname = other.KeyName()
return sq.Select(slct).From(d.TableName(other)).Where(sq.Eq{kname: keys}), nil
}
func (d *DbMap) ManyToMany(m Model, mapping Mapping) ([]interface{}, error) {
sb, err := d.ManyToManyBuilder(m, mapping, "")
if err != nil {
return []interface{}{}, err
}
ms, err := d.Query(mapping.OtherModel(m), sb)
if err != nil {
return ms, err
}
if hma, ok := m.(HasManySetter); ok {
hma.SetHasMany(ms)
}
if hoa, ok := m.(HasOneSetter); ok {
if len(ms) > 0 {
hoa.SetHasOne(ms[0].(Model))
}
}
return ms, nil
}