for FieldSchema.LookUpField or column Alias Delimiter

This commit is contained in:
daheige 2021-03-13 17:16:32 +08:00
parent b7d4fe1a34
commit 10ef50b606
2 changed files with 12 additions and 7 deletions

View File

@ -121,7 +121,7 @@ func BuildQuerySQL(db *gorm.DB) {
clauseSelect.Columns = append(clauseSelect.Columns, clause.Column{
Table: tableAliasName,
Name: s,
Alias: tableAliasName + "__" + s,
Alias: tableAliasName + gorm.DoubleUnderscore + s,
})
}

17
scan.go
View File

@ -10,6 +10,11 @@ import (
"gorm.io/gorm/schema"
)
const (
// DoubleUnderscore for FieldSchema.LookUpField or column Alias Delimiter
DoubleUnderscore = "__"
)
func prepareValues(values []interface{}, db *DB, columnTypes []*sql.ColumnType, columns []string) {
if db.Statement.Schema != nil {
for idx, name := range columns {
@ -121,9 +126,9 @@ func Scan(rows *sql.Rows, db *DB, initialized bool) {
for idx, column := range columns {
if field := Schema.LookUpField(column); field != nil && field.Readable {
fields[idx] = field
} else if names := strings.Split(column, "__"); len(names) > 1 {
} else if names := strings.Split(column, DoubleUnderscore); len(names) > 1 {
if rel, ok := Schema.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:], DoubleUnderscore)); field != nil && field.Readable {
fields[idx] = field
if len(joinFields) == 0 {
@ -200,9 +205,9 @@ func Scan(rows *sql.Rows, db *DB, initialized bool) {
for idx, column := range columns {
if field := Schema.LookUpField(column); field != nil && field.Readable {
values[idx] = reflect.New(reflect.PtrTo(field.IndirectFieldType)).Interface()
} else if names := strings.Split(column, "__"); len(names) > 1 {
} else if names := strings.Split(column, DoubleUnderscore); len(names) > 1 {
if rel, ok := Schema.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:], DoubleUnderscore)); field != nil && field.Readable {
values[idx] = reflect.New(reflect.PtrTo(field.IndirectFieldType)).Interface()
continue
}
@ -219,9 +224,9 @@ func Scan(rows *sql.Rows, db *DB, initialized bool) {
for idx, column := range columns {
if field := Schema.LookUpField(column); field != nil && field.Readable {
field.Set(db.Statement.ReflectValue, values[idx])
} else if names := strings.Split(column, "__"); len(names) > 1 {
} else if names := strings.Split(column, DoubleUnderscore); len(names) > 1 {
if rel, ok := Schema.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:], DoubleUnderscore)); field != nil && field.Readable {
relValue := rel.Field.ReflectValueOf(db.Statement.ReflectValue)
value := reflect.ValueOf(values[idx]).Elem()