join with conditions
This commit is contained in:
@@ -62,23 +62,46 @@ func (t Table) Select(field ...Field) SelectClause {
|
||||
return qb
|
||||
}
|
||||
|
||||
func (q *selectQry) Join(t Table, t1Field, t2Field Field) SelectClause {
|
||||
q.join = append(q.join, "JOIN "+t.Name+" ON "+t1Field.String()+" = "+t2Field.String())
|
||||
return q
|
||||
func (q *selectQry) Join(t Table, t1Field, t2Field Field, cond ...Conditioner) SelectClause {
|
||||
return q.buildJoin(t, "JOIN", t1Field, t2Field, cond...)
|
||||
}
|
||||
|
||||
func (q *selectQry) LeftJoin(t Table, t1Field, t2Field Field) SelectClause {
|
||||
q.join = append(q.join, "LEFT JOIN "+t.Name+" ON "+t1Field.String()+" = "+t2Field.String())
|
||||
return q
|
||||
func (q *selectQry) LeftJoin(t Table, t1Field, t2Field Field, cond ...Conditioner) SelectClause {
|
||||
return q.buildJoin(t, "LEFT JOIN", t1Field, t2Field, cond...)
|
||||
}
|
||||
|
||||
func (q *selectQry) RightJoin(t Table, t1Field, t2Field Field) SelectClause {
|
||||
q.join = append(q.join, "RIGHT JOIN "+t.Name+" ON "+t1Field.String()+" = "+t2Field.String())
|
||||
return q
|
||||
func (q *selectQry) RightJoin(t Table, t1Field, t2Field Field, cond ...Conditioner) SelectClause {
|
||||
return q.buildJoin(t, "RIGHT JOIN", t1Field, t2Field, cond...)
|
||||
}
|
||||
|
||||
func (q *selectQry) FullJoin(t Table, t1Field, t2Field Field) SelectClause {
|
||||
q.join = append(q.join, "FULL JOIN "+t.Name+" ON "+t1Field.String()+" = "+t2Field.String())
|
||||
func (q *selectQry) FullJoin(t Table, t1Field, t2Field Field, cond ...Conditioner) SelectClause {
|
||||
return q.buildJoin(t, "FULL JOIN", t1Field, t2Field, cond...)
|
||||
}
|
||||
|
||||
func (q *selectQry) buildJoin(t Table, joinKW string, t1Field, t2Field Field, cond ...Conditioner) SelectClause {
|
||||
str := joinKW + " " + t.Name + " ON " + t1Field.String() + " = " + t2Field.String()
|
||||
if len(cond) == 0 { // Join with no condition
|
||||
q.join = append(q.join, str)
|
||||
return q
|
||||
}
|
||||
|
||||
// Join has condition(s)
|
||||
sb := getSB()
|
||||
defer putSB(sb)
|
||||
sb.Grow(len(str) * 2)
|
||||
|
||||
sb.WriteString(str + " AND ")
|
||||
|
||||
var argIdx int
|
||||
for i, c := range cond {
|
||||
argIdx = len(q.args)
|
||||
if i > 0 {
|
||||
sb.WriteString(" AND ")
|
||||
}
|
||||
sb.WriteString(c.Condition(&q.args, argIdx))
|
||||
}
|
||||
|
||||
q.join = append(q.join, sb.String())
|
||||
return q
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user