Fix query when map keys include table-qualified column names, close #7507

This commit is contained in:
Jinzhu 2025-07-22 14:21:04 +08:00
parent c63374f5d1
commit 9af6d510b5
2 changed files with 10 additions and 0 deletions

View File

@ -364,6 +364,9 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
for _, key := range keys {
column := clause.Column{Name: key, Table: curTable}
if strings.Contains(key, ".") {
column = clause.Column{Name: key}
}
conds = append(conds, clause.Eq{Column: column, Value: v[key]})
}
case map[string]interface{}:
@ -376,6 +379,9 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) []
for _, key := range keys {
reflectValue := reflect.Indirect(reflect.ValueOf(v[key]))
column := clause.Column{Name: key, Table: curTable}
if strings.Contains(key, ".") {
column = clause.Column{Name: key}
}
switch reflectValue.Kind() {
case reflect.Slice, reflect.Array:
if _, ok := v[key].(driver.Valuer); ok {

View File

@ -1127,6 +1127,10 @@ func TestSearchWithMap(t *testing.T) {
DB.First(&user, map[string]interface{}{"name": users[0].Name})
CheckUser(t, user, users[0])
user = User{}
DB.First(&user, map[string]interface{}{"users.name": users[0].Name})
CheckUser(t, user, users[0])
user = User{}
DB.Where(map[string]interface{}{"name": users[1].Name}).First(&user)
CheckUser(t, user, users[1])