Fix: Wrong value when Find with JOIN and same column name (#5711)
This commit is contained in:
parent
490625981a
commit
b4490de97e
26
scan.go
26
scan.go
@ -200,28 +200,20 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
||||
|
||||
// Not Pluck
|
||||
if sch != nil {
|
||||
schFieldsCount := len(sch.Fields)
|
||||
for idx, column := range columns {
|
||||
if field := sch.LookUpField(column); field != nil && field.Readable {
|
||||
if curIndex, ok := selectedColumnsMap[column]; ok {
|
||||
fields[idx] = field // handle duplicate fields
|
||||
offset := curIndex + 1
|
||||
// handle sch inconsistent with database
|
||||
// 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
|
||||
for i, field := range sch.Fields[selectedColumnsMap[column]:] {
|
||||
if field.DBName == column {
|
||||
if field.Readable {
|
||||
fields[idx] = field
|
||||
selectedColumnsMap[column] += i + 1
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
if fields[idx] != nil {
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
fields[idx] = field
|
||||
selectedColumnsMap[column] = idx
|
||||
}
|
||||
} else if names := strings.Split(column, "__"); len(names) > 1 {
|
||||
if names := strings.Split(column, "__"); len(names) > 1 {
|
||||
if rel, ok := sch.Relationships.Relations[names[0]]; ok {
|
||||
if field := rel.FieldSchema.LookUpField(strings.Join(names[1:], "__")); field != nil && field.Readable {
|
||||
fields[idx] = field
|
||||
|
@ -3,6 +3,7 @@ package tests_test
|
||||
import (
|
||||
"regexp"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gorm.io/gorm"
|
||||
@ -229,3 +230,32 @@ func TestJoinWithSoftDeleted(t *testing.T) {
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user