Fix query with Joins

This commit is contained in:
Jinzhu 2015-10-01 07:43:38 +08:00
parent 4da2c28d4d
commit eeb9ba2250
3 changed files with 21 additions and 4 deletions

View File

@ -425,21 +425,35 @@ func TestGroup(t *testing.T) {
} }
func TestJoins(t *testing.T) { func TestJoins(t *testing.T) {
var user = User{
Name: "joins",
Emails: []Email{{Email: "join1@example.com"}, {Email: "join2@example.com"}},
}
DB.Save(&user)
var result User
DB.Joins("left join emails on emails.user_id = users.id").Where("name = ?", "joins").First(&result)
if result.Name != "joins" || result.Id != user.Id {
t.Errorf("Should find all two emails with Join")
}
}
func TestJoinsWithSelect(t *testing.T) {
type result struct { type result struct {
Name string Name string
Email string Email string
} }
user := User{ user := User{
Name: "joins", Name: "joins_with_select",
Emails: []Email{{Email: "join1@example.com"}, {Email: "join2@example.com"}}, Emails: []Email{{Email: "join1@example.com"}, {Email: "join2@example.com"}},
} }
DB.Save(&user) DB.Save(&user)
var results []result var results []result
DB.Table("users").Select("name, email").Joins("left join emails on emails.user_id = users.id").Where("name = ?", "joins").Scan(&results) DB.Table("users").Select("name, email").Joins("left join emails on emails.user_id = users.id").Where("name = ?", "joins_with_select").Scan(&results)
if len(results) != 2 || results[0].Email != "join1@example.com" || results[1].Email != "join2@example.com" { if len(results) != 2 || results[0].Email != "join1@example.com" || results[1].Email != "join2@example.com" {
t.Errorf("Should find all two emails with Join") t.Errorf("Should find all two emails with Join select")
} }
} }

View File

@ -209,7 +209,7 @@ func (scope *Scope) handleHasManyToManyPreload(field *Field, conditions []interf
sourceKeys = append(sourceKeys, key.DBName) sourceKeys = append(sourceKeys, key.DBName)
} }
db := scope.NewDB().Table(scope.New(reflect.New(destType).Interface()).TableName()) db := scope.NewDB().Table(scope.New(reflect.New(destType).Interface()).TableName()).Select("*")
preloadJoinDB := joinTableHandler.JoinWith(joinTableHandler, db, scope.Value) preloadJoinDB := joinTableHandler.JoinWith(joinTableHandler, db, scope.Value)
if len(conditions) > 0 { if len(conditions) > 0 {
preloadJoinDB = preloadJoinDB.Where(conditions[0], conditions[1:]...) preloadJoinDB = preloadJoinDB.Where(conditions[0], conditions[1:]...)

View File

@ -213,6 +213,9 @@ var hasCountRegexp = regexp.MustCompile(`(?i)count(.+)`)
func (scope *Scope) selectSql() string { func (scope *Scope) selectSql() string {
if len(scope.Search.selects) == 0 { if len(scope.Search.selects) == 0 {
if scope.Search.joins != "" {
return fmt.Sprintf("%v.*", scope.QuotedTableName())
}
return "*" return "*"
} }
sql := scope.buildSelectQuery(scope.Search.selects) sql := scope.buildSelectQuery(scope.Search.selects)