Fix: Wrong value when Find with JOIN and same column name (#5711)

This commit is contained in:
Stephano George 2022-09-27 17:13:14 +08:00
parent 490625981a
commit b4490de97e
2 changed files with 41 additions and 19 deletions

30
scan.go
View File

@ -200,28 +200,20 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
// Not Pluck // Not Pluck
if sch != nil { if sch != nil {
schFieldsCount := len(sch.Fields)
for idx, column := range columns { for idx, column := range columns {
if field := sch.LookUpField(column); field != nil && field.Readable { for i, field := range sch.Fields[selectedColumnsMap[column]:] {
if curIndex, ok := selectedColumnsMap[column]; ok { if field.DBName == column {
fields[idx] = field // handle duplicate fields if field.Readable {
offset := curIndex + 1 fields[idx] = field
// handle sch inconsistent with database selectedColumnsMap[column] += i + 1
// like Raw(`...`).Scan
if schFieldsCount > offset {
for fieldIndex, selectField := range sch.Fields[offset:] {
if selectField.DBName == column && selectField.Readable {
selectedColumnsMap[column] = curIndex + fieldIndex + 1
fields[idx] = selectField
break
}
}
} }
} else { break
fields[idx] = field
selectedColumnsMap[column] = idx
} }
} else if names := strings.Split(column, "__"); len(names) > 1 { }
if fields[idx] != nil {
continue
}
if names := strings.Split(column, "__"); len(names) > 1 {
if rel, ok := sch.Relationships.Relations[names[0]]; ok { if rel, ok := sch.Relationships.Relations[names[0]]; ok {
if field := rel.FieldSchema.LookUpField(strings.Join(names[1:], "__")); field != nil && field.Readable { if field := rel.FieldSchema.LookUpField(strings.Join(names[1:], "__")); field != nil && field.Readable {
fields[idx] = field fields[idx] = field

View File

@ -3,6 +3,7 @@ package tests_test
import ( import (
"regexp" "regexp"
"sort" "sort"
"strings"
"testing" "testing"
"gorm.io/gorm" "gorm.io/gorm"
@ -229,3 +230,32 @@ func TestJoinWithSoftDeleted(t *testing.T) {
t.Fatalf("joins NamedPet and Account should not empty:%v", user2) t.Fatalf("joins NamedPet and Account should not empty:%v", user2)
} }
} }
func TestJoinWithSameColumnName(t *testing.T) {
user := GetUser("TestJoinWithSameColumnName", Config{
Languages: 1,
Pets: 1,
})
DB.Create(user)
type UserSpeak struct {
UserID uint
LanguageCode string
}
type Result struct {
User
UserSpeak
Language
Pet
}
results := make([]Result, 0, 1)
DB.Select("*").Table("users").Joins("JOIN user_speaks ON user_speaks.user_id = users.id").
Joins("JOIN languages ON languages.code = user_speaks.language_code").
Joins("LEFT OUTER JOIN pets ON pets.user_id = users.id").Find(&results)
if len(results) == 0 {
t.Fatalf("no record find")
} else if results[0].Pet.UserID == nil {
t.Fatalf("wrong user id in pet")
} else if !strings.Contains(results[0].Pet.Name, "_pet_") {
t.Fatalf("wrong pet name")
}
}