Join support builder (#1002)
* join support builder * add tests * fix tests * fix tests * fix join sub query
This commit is contained in:
parent
c68531db53
commit
731b056a56
|
@ -334,3 +334,47 @@ func TestQueryWithBuilder(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assertResult(t, results)
|
assertResult(t, results)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestJoinWithSubQuery(t *testing.T) {
|
||||||
|
assert.NoError(t, prepareEngine())
|
||||||
|
|
||||||
|
type JoinWithSubQuery1 struct {
|
||||||
|
Id int64 `xorm:"autoincr pk"`
|
||||||
|
Msg string `xorm:"varchar(255)"`
|
||||||
|
DepartId int64
|
||||||
|
Money float32
|
||||||
|
}
|
||||||
|
|
||||||
|
type JoinWithSubQueryDepart struct {
|
||||||
|
Id int64 `xorm:"autoincr pk"`
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
testEngine.ShowSQL(true)
|
||||||
|
|
||||||
|
assert.NoError(t, testEngine.Sync2(new(JoinWithSubQuery1), new(JoinWithSubQueryDepart)))
|
||||||
|
|
||||||
|
var depart = JoinWithSubQueryDepart{
|
||||||
|
Name: "depart1",
|
||||||
|
}
|
||||||
|
cnt, err := testEngine.Insert(&depart)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
var q = JoinWithSubQuery1{
|
||||||
|
Msg: "message",
|
||||||
|
DepartId: depart.Id,
|
||||||
|
Money: 3000,
|
||||||
|
}
|
||||||
|
|
||||||
|
cnt, err = testEngine.Insert(&q)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, cnt)
|
||||||
|
|
||||||
|
var querys []JoinWithSubQuery1
|
||||||
|
err = testEngine.Join("INNER", builder.Select("id").From(testEngine.Quote(testEngine.TableName("join_with_sub_query_depart", true))),
|
||||||
|
"join_with_sub_query_depart.id = join_with_sub_query1.depart_id").Find(&querys)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.EqualValues(t, 1, len(querys))
|
||||||
|
assert.EqualValues(t, q, querys[0])
|
||||||
|
}
|
||||||
|
|
25
statement.go
25
statement.go
|
@ -757,9 +757,32 @@ func (statement *Statement) Join(joinOP string, tablename interface{}, condition
|
||||||
fmt.Fprintf(&buf, "%v JOIN ", joinOP)
|
fmt.Fprintf(&buf, "%v JOIN ", joinOP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch tp := tablename.(type) {
|
||||||
|
case builder.Builder:
|
||||||
|
subSQL, subQueryArgs, err := tp.ToSQL()
|
||||||
|
if err != nil {
|
||||||
|
statement.lastError = err
|
||||||
|
return statement
|
||||||
|
}
|
||||||
|
tbs := strings.Split(tp.TableName(), ".")
|
||||||
|
var aliasName = strings.Trim(tbs[len(tbs)-1], statement.Engine.QuoteStr())
|
||||||
|
fmt.Fprintf(&buf, "(%s) %s ON %v", subSQL, aliasName, condition)
|
||||||
|
statement.joinArgs = append(statement.joinArgs, subQueryArgs...)
|
||||||
|
case *builder.Builder:
|
||||||
|
subSQL, subQueryArgs, err := tp.ToSQL()
|
||||||
|
if err != nil {
|
||||||
|
statement.lastError = err
|
||||||
|
return statement
|
||||||
|
}
|
||||||
|
tbs := strings.Split(tp.TableName(), ".")
|
||||||
|
var aliasName = strings.Trim(tbs[len(tbs)-1], statement.Engine.QuoteStr())
|
||||||
|
fmt.Fprintf(&buf, "(%s) %s ON %v", subSQL, aliasName, condition)
|
||||||
|
statement.joinArgs = append(statement.joinArgs, subQueryArgs...)
|
||||||
|
default:
|
||||||
tbName := statement.Engine.TableName(tablename, true)
|
tbName := statement.Engine.TableName(tablename, true)
|
||||||
|
|
||||||
fmt.Fprintf(&buf, "%s ON %v", tbName, condition)
|
fmt.Fprintf(&buf, "%s ON %v", tbName, condition)
|
||||||
|
}
|
||||||
|
|
||||||
statement.JoinStr = buf.String()
|
statement.JoinStr = buf.String()
|
||||||
statement.joinArgs = append(statement.joinArgs, args...)
|
statement.joinArgs = append(statement.joinArgs, args...)
|
||||||
return statement
|
return statement
|
||||||
|
|
Loading…
Reference in New Issue