Merge 84d9694eb32b31ea36d8a526d6a66b50709cd017 into 4c93473b2d05cc6a57be49f2a5713c087853088a

This commit is contained in:
Domen Ipavec 2018-02-11 05:10:03 +00:00 committed by GitHub
commit 2dddf95f3e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 1 deletions

View File

@ -674,3 +674,27 @@ func TestSelectWithArrayInput(t *testing.T) {
t.Errorf("Should have selected both age and name")
}
}
func TestPluckWithSelect(t *testing.T) {
DB.Save(&User{Name: "matematik7", Age: 25})
var userAges []string
err := DB.Model(&User{}).Where("age = ?", 25).Select("name || ' - ' || age as user_age").Pluck("user_age", &userAges).Error
if err != nil {
t.Error(err)
}
if len(userAges) != 1 || userAges[0] != "matematik7 - 25" {
t.Errorf("Should correctly pluck with select, got: %s", userAges)
}
userAges = userAges[:0]
err = DB.Model(&User{}).Where("age = ?", 25).Select("name || ' - ' || age as \"user_age\"").Pluck("user_age", &userAges).Error
if err != nil {
t.Error(err)
}
if len(userAges) != 1 || userAges[0] != "matematik7 - 25" {
t.Errorf("Should correctly pluck with select, got: %s", userAges)
}
}

View File

@ -938,14 +938,34 @@ func (scope *Scope) initialize() *Scope {
return scope
}
func (scope *Scope) isQueryForColumn(query interface{}, column string) bool {
queryStr := strings.ToLower(fmt.Sprint(query))
if queryStr == column {
return true
}
if strings.HasSuffix(queryStr, "as "+column) {
return true
}
if strings.HasSuffix(queryStr, "as \""+column+"\"") {
return true
}
return false
}
func (scope *Scope) pluck(column string, value interface{}) *Scope {
dest := reflect.Indirect(reflect.ValueOf(value))
scope.Search.Select(column)
if dest.Kind() != reflect.Slice {
scope.Err(fmt.Errorf("results should be a slice, not %s", dest.Kind()))
return scope
}
if query, ok := scope.Search.selects["query"]; !ok || !scope.isQueryForColumn(query, column) {
scope.Search.Select(column)
}
rows, err := scope.rows()
if scope.Err(err) == nil {
defer rows.Close()