@@ -31,7 +31,7 @@ private function getInclude(Context $context): array
31
31
if (! empty ($ queryParams ['include ' ])) {
32
32
$ include = $ this ->parseInclude ($ queryParams ['include ' ]);
33
33
34
- $ this ->validateInclude ($ this ->resource , $ include );
34
+ $ this ->validateInclude ([ $ this ->resource ] , $ include );
35
35
36
36
return $ include ;
37
37
}
@@ -58,26 +58,38 @@ private function parseInclude(string $include): array
58
58
return $ tree ;
59
59
}
60
60
61
- private function validateInclude (ResourceType $ resource , array $ include , string $ path = '' )
61
+ private function validateInclude (array $ resources , array $ include , string $ path = '' )
62
62
{
63
- $ fields = $ resource ->getSchema ()->getFields ();
64
-
65
63
foreach ($ include as $ name => $ nested ) {
66
- if (
67
- ! isset ($ fields [$ name ])
68
- || ! $ fields [$ name ] instanceof Relationship
69
- || ! $ fields [$ name ]->isIncludable ()
70
- ) {
71
- throw new BadRequestException ("Invalid include [ {$ path }{$ name }] " , 'include ' );
72
- }
64
+ foreach ($ resources as $ resource ) {
65
+ $ fields = $ resource ->getSchema ()->getFields ();
66
+
67
+ if (
68
+ ! isset ($ fields [$ name ])
69
+ || ! $ fields [$ name ] instanceof Relationship
70
+ || ! $ fields [$ name ]->isIncludable ()
71
+ ) {
72
+ continue ;
73
+ }
74
+
75
+ $ type = $ fields [$ name ]->getType ();
73
76
74
- if (( $ type = $ fields [ $ name ]-> getType ()) && is_string ($ type )) {
75
- $ relatedResource = $ this ->api ->getResource ($ type );
77
+ if ( is_string ($ type )) {
78
+ $ relatedResource = $ this ->api ->getResource ($ type );
76
79
77
- $ this ->validateInclude ($ relatedResource , $ nested , $ name .'. ' );
78
- } elseif ($ nested ) {
79
- throw new BadRequestException ("Invalid include [ {$ path }{$ name }.*] " , 'include ' );
80
+ $ this ->validateInclude ([$ relatedResource ], $ nested , $ name .'. ' );
81
+ } else {
82
+ $ relatedResources = is_array ($ type ) ? array_map (function ($ type ) {
83
+ return $ this ->api ->getResource ($ type );
84
+ }, $ type ) : array_values ($ this ->api ->getResources ());
85
+
86
+ $ this ->validateInclude ($ relatedResources , $ nested , $ name .'. ' );
87
+ }
88
+
89
+ continue 2 ;
80
90
}
91
+
92
+ throw new BadRequestException ("Invalid include [ {$ path }{$ name }] " , 'include ' );
81
93
}
82
94
}
83
95
@@ -123,10 +135,13 @@ private function loadRelationshipsAtLevel(array $models, array $relationshipPath
123
135
}, $ relatedResources ),
124
136
125
137
array_map (function ($ relatedResource ) use ($ context , $ field ) {
126
- return function ($ query ) use ($ context , $ field , $ relatedResource ) {
127
- run_callbacks ($ relatedResource ->getSchema ()->getListeners ('scope ' ), [$ query , $ context ]);
128
- run_callbacks ($ field ->getListeners ('scope ' ), [$ query , $ context ]);
129
- };
138
+ return [
139
+ 'resource ' => $ relatedResource ,
140
+ 'scope ' => function ($ query ) use ($ context , $ field , $ relatedResource ) {
141
+ run_callbacks ($ relatedResource ->getSchema ()->getListeners ('scope ' ), [$ query , $ context ]);
142
+ run_callbacks ($ field ->getListeners ('scope ' ), [$ query , $ context ]);
143
+ }
144
+ ];
130
145
}, $ relatedResources )
131
146
);
132
147
}
0 commit comments