for FieldSchema.LookUpField or column Alias Delimiter

This commit is contained in:
daheige 2021-03-14 21:02:55 +08:00
parent c1a317f369
commit c8c9af7476
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{ clauseSelect.Columns = append(clauseSelect.Columns, clause.Column{
Table: tableAliasName, Table: tableAliasName,
Name: s, Name: s,
Alias: tableAliasName + "__" + s, Alias: tableAliasName + gorm.DoubleUnderscore + s,
}) })
} }

17
scan.go
View File

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