forked from mirror/gorm
Fix query with Joins
This commit is contained in:
parent
4da2c28d4d
commit
eeb9ba2250
20
main_test.go
20
main_test.go
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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:]...)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue