mirror of https://github.com/go-gorm/gorm.git
Add inline condition support for Preload
This commit is contained in:
parent
87b23edd3b
commit
24e0de116a
|
@ -36,7 +36,7 @@ func Preload(scope *Scope) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if scope.Search.Preload != nil {
|
if scope.Search.Preload != nil {
|
||||||
for key := range scope.Search.Preload {
|
for key, conditions := range scope.Search.Preload {
|
||||||
for _, field := range fields {
|
for _, field := range fields {
|
||||||
if field.Name == key && field.Relationship != nil {
|
if field.Name == key && field.Relationship != nil {
|
||||||
results := makeSlice(field.Field)
|
results := makeSlice(field.Field)
|
||||||
|
@ -47,7 +47,7 @@ func Preload(scope *Scope) {
|
||||||
switch relation.Kind {
|
switch relation.Kind {
|
||||||
case "has_one":
|
case "has_one":
|
||||||
condition := fmt.Sprintf("%v IN (?)", scope.Quote(relation.ForeignDBName()))
|
condition := fmt.Sprintf("%v IN (?)", scope.Quote(relation.ForeignDBName()))
|
||||||
scope.NewDB().Find(results, condition, scope.getColumnAsArray(primaryName))
|
scope.NewDB().Where(condition, scope.getColumnAsArray(primaryName)).Find(results, conditions...)
|
||||||
|
|
||||||
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
||||||
for i := 0; i < resultValues.Len(); i++ {
|
for i := 0; i < resultValues.Len(); i++ {
|
||||||
|
@ -67,7 +67,7 @@ func Preload(scope *Scope) {
|
||||||
}
|
}
|
||||||
case "has_many":
|
case "has_many":
|
||||||
condition := fmt.Sprintf("%v IN (?)", scope.Quote(relation.ForeignDBName()))
|
condition := fmt.Sprintf("%v IN (?)", scope.Quote(relation.ForeignDBName()))
|
||||||
scope.NewDB().Find(results, condition, scope.getColumnAsArray(primaryName))
|
scope.NewDB().Where(condition, scope.getColumnAsArray(primaryName)).Find(results, conditions...)
|
||||||
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
||||||
if isSlice {
|
if isSlice {
|
||||||
for i := 0; i < resultValues.Len(); i++ {
|
for i := 0; i < resultValues.Len(); i++ {
|
||||||
|
@ -87,7 +87,7 @@ func Preload(scope *Scope) {
|
||||||
scope.SetColumn(field, resultValues)
|
scope.SetColumn(field, resultValues)
|
||||||
}
|
}
|
||||||
case "belongs_to":
|
case "belongs_to":
|
||||||
scope.NewDB().Find(results, scope.getColumnAsArray(relation.ForeignKey))
|
scope.NewDB().Where(scope.getColumnAsArray(relation.ForeignKey)).Find(results, conditions...)
|
||||||
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
resultValues := reflect.Indirect(reflect.ValueOf(results))
|
||||||
for i := 0; i < resultValues.Len(); i++ {
|
for i := 0; i < resultValues.Len(); i++ {
|
||||||
result := resultValues.Index(i)
|
result := resultValues.Index(i)
|
||||||
|
|
|
@ -84,4 +84,17 @@ func TestPreload(t *testing.T) {
|
||||||
for _, user := range users2 {
|
for _, user := range users2 {
|
||||||
checkUserHasPreloadData(*user, t)
|
checkUserHasPreloadData(*user, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var users3 []*User
|
||||||
|
DB.Where("role = ?", "Preload").Preload("Emails", "email = ?", user3.Emails[0].Email).Find(&users3)
|
||||||
|
|
||||||
|
for _, user := range users3 {
|
||||||
|
if user.Name == user3.Name {
|
||||||
|
if len(user.Emails) != 1 {
|
||||||
|
t.Errorf("should only preload one emails for user3 when with condition")
|
||||||
|
}
|
||||||
|
} else if len(user.Emails) != 0 {
|
||||||
|
t.Errorf("should not preload any emails for other users when with condition")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue