@@ -101,7 +101,7 @@ ScopeDefinition.prototype.related = function(receiver, scopeParams, condOrRefres
101
101
var filter = params . include ;
102
102
// The filter applied on relatedModel
103
103
var queryRelated = filter . scope ;
104
- delete params . include . scope ;
104
+ delete params . include ;
105
105
} ;
106
106
107
107
targetModel . find ( params , options , function ( err , data ) {
@@ -112,12 +112,13 @@ ScopeDefinition.prototype.related = function(receiver, scopeParams, condOrRefres
112
112
113
113
if ( scopeOnRelatedModel === true ) {
114
114
var relatedModel = targetModel . relations [ filter . relation ] . modelTo ;
115
+ var keyFrom = targetModel . relations [ filter . relation ] . keyFrom ;
115
116
var IdKey = idName ( relatedModel ) ;
116
117
117
118
// Merge queryRelated filter and targetId filter
118
119
var buildWhere = function ( ) {
119
120
var IdKeyCondition = { } ;
120
- IdKeyCondition [ IdKey ] = collectTargetIds ( data , IdKey ) ;
121
+ IdKeyCondition [ IdKey ] = collectTargetIds ( data , keyFrom || IdKey ) ;
121
122
var mergedWhere = {
122
123
and : [ IdKeyCondition , queryRelated . where ] ,
123
124
} ;
@@ -127,7 +128,7 @@ ScopeDefinition.prototype.related = function(receiver, scopeParams, condOrRefres
127
128
queryRelated . where = buildWhere ( ) ;
128
129
} else {
129
130
queryRelated . where = { } ;
130
- queryRelated . where [ IdKey ] = collectTargetIds ( data , IdKey ) ;
131
+ queryRelated . where [ IdKey ] = collectTargetIds ( data , keyFrom || IdKey ) ;
131
132
}
132
133
133
134
relatedModel . find ( queryRelated , cb ) ;
@@ -486,11 +487,49 @@ function defineScope(cls, targetClass, name, params, methods, options) {
486
487
options = { } ;
487
488
}
488
489
options = options || { } ;
489
-
490
+ // If there is a through model
491
+ // run another query to apply filter on relatedModel(targetModel)
492
+ // see github.com/strongloop/loopback-datasource-juggler/issues/1795
493
+ var scopeOnRelatedModel = false ;
494
+ if ( this . _scope && this . _scope . collect &&
495
+ where !== null && typeof where === 'object' ) {
496
+ var queryRelated = {
497
+ relation : this . _scope . collect ,
498
+ scope : {
499
+ where : where ,
500
+ } ,
501
+ } ;
502
+ where = { } ;
503
+ scopeOnRelatedModel = true ;
504
+ }
490
505
var targetModel = definition . targetModel ( this . _receiver ) ;
491
506
var scoped = ( this . _scope && this . _scope . where ) || { } ;
492
507
var filter = mergeQuery ( { where : scoped } , { where : where || { } } ) ;
493
- return targetModel . count ( filter . where , options , cb ) ;
508
+ if ( ! scopeOnRelatedModel ) {
509
+ return targetModel . count ( filter . where , options , cb ) ;
510
+ }
511
+ targetModel . find ( filter , options , function ( err , data ) {
512
+ var relatedModel = targetModel . relations [ queryRelated . relation ] . modelTo ;
513
+ var keyFrom = targetModel . relations [ queryRelated . relation ] . keyFrom ;
514
+ var IdKey = idName ( relatedModel ) ;
515
+
516
+ // Merge queryRelated filter and targetId filter
517
+ var buildWhere = function ( ) {
518
+ var IdKeyCondition = { } ;
519
+ IdKeyCondition [ IdKey ] = collectTargetIds ( data , keyFrom || IdKey ) ;
520
+ var mergedWhere = {
521
+ and : [ IdKeyCondition , queryRelated . scope . where ] ,
522
+ } ;
523
+ return mergedWhere ;
524
+ } ;
525
+ if ( queryRelated . scope . where !== undefined ) {
526
+ queryRelated . scope . where = buildWhere ( ) ;
527
+ } else {
528
+ queryRelated . scope . where = { } ;
529
+ queryRelated . scope . where [ IdKey ] = collectTargetIds ( data , keyFrom || IdKey ) ;
530
+ }
531
+ return relatedModel . count ( queryRelated . scope . where , options , cb ) ;
532
+ } ) ;
494
533
}
495
534
496
535
return definition ;
0 commit comments