(fmter QueryFormatter, q *Query)
| 98 | } |
| 99 | |
| 100 | func (j *join) m2mQuery(fmter QueryFormatter, q *Query) (*Query, error) { |
| 101 | m2mModel := newM2MModel(j) |
| 102 | if m2mModel == nil { |
| 103 | return nil, nil |
| 104 | } |
| 105 | |
| 106 | q = q.Model(m2mModel) |
| 107 | if j.ApplyQuery != nil { |
| 108 | var err error |
| 109 | q, err = j.ApplyQuery(q) |
| 110 | if err != nil { |
| 111 | return nil, err |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | if len(q.columns) == 0 { |
| 116 | q.columns = append(q.columns, &hasManyColumnsAppender{j}) |
| 117 | } |
| 118 | |
| 119 | index := j.JoinModel.ParentIndex() |
| 120 | baseTable := j.BaseModel.Table() |
| 121 | |
| 122 | //nolint |
| 123 | var join []byte |
| 124 | join = append(join, "JOIN "...) |
| 125 | join = fmter.FormatQuery(join, string(j.Rel.M2MTableName)) |
| 126 | join = append(join, " AS "...) |
| 127 | join = append(join, j.Rel.M2MTableAlias...) |
| 128 | join = append(join, " ON ("...) |
| 129 | for i, col := range j.Rel.M2MBaseFKs { |
| 130 | if i > 0 { |
| 131 | join = append(join, ", "...) |
| 132 | } |
| 133 | join = append(join, j.Rel.M2MTableAlias...) |
| 134 | join = append(join, '.') |
| 135 | join = types.AppendIdent(join, col, 1) |
| 136 | } |
| 137 | join = append(join, ") IN ("...) |
| 138 | join = appendChildValues(join, j.BaseModel.Root(), index, baseTable.PKs) |
| 139 | join = append(join, ")"...) |
| 140 | q = q.Join(internal.BytesToString(join)) |
| 141 | |
| 142 | joinTable := j.JoinModel.Table() |
| 143 | for i, col := range j.Rel.M2MJoinFKs { |
| 144 | pk := joinTable.PKs[i] |
| 145 | q = q.Where("?.? = ?.?", |
| 146 | joinTable.Alias, pk.Column, |
| 147 | j.Rel.M2MTableAlias, types.Ident(col)) |
| 148 | } |
| 149 | |
| 150 | return q, nil |
| 151 | } |
| 152 | |
| 153 | func (j *join) hasParent() bool { |
| 154 | if j.Parent != nil { |
no test coverage detected