Merge pull request #1052 from stroborobo/fix-polymorphic-preload

Add support for polymorphic preload
This commit is contained in:
Jinzhu 2016-06-01 22:51:20 +08:00
commit 09427a07b2
1 changed files with 16 additions and 2 deletions

View File

@ -104,8 +104,15 @@ func (scope *Scope) handleHasOnePreload(field *Field, conditions []interface{})
preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions)
// find relations // find relations
query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys))
values := toQueryValues(primaryKeys)
if relation.PolymorphicType != "" {
query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName))
values = append(values, scope.TableName())
}
results := makeSlice(field.Struct.Type) results := makeSlice(field.Struct.Type)
scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error)
// assign find results // assign find results
var ( var (
@ -143,8 +150,15 @@ func (scope *Scope) handleHasManyPreload(field *Field, conditions []interface{})
preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions) preloadDB, preloadConditions := scope.generatePreloadDBWithConditions(conditions)
// find relations // find relations
query := fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys))
values := toQueryValues(primaryKeys)
if relation.PolymorphicType != "" {
query += fmt.Sprintf(" AND %v = ?", scope.Quote(relation.PolymorphicDBName))
values = append(values, scope.TableName())
}
results := makeSlice(field.Struct.Type) results := makeSlice(field.Struct.Type)
scope.Err(preloadDB.Where(fmt.Sprintf("%v IN (%v)", toQueryCondition(scope, relation.ForeignDBNames), toQueryMarks(primaryKeys)), toQueryValues(primaryKeys)...).Find(results, preloadConditions...).Error) scope.Err(preloadDB.Where(query, values...).Find(results, preloadConditions...).Error)
// assign find results // assign find results
var ( var (