55use Closure ;
66use Illuminate \Contracts \Pagination \CursorPaginator ;
77use Illuminate \Contracts \Pagination \Paginator ;
8+ use Illuminate \Database \Eloquent \Builder as EloquentBuilder ;
89use Illuminate \Database \Eloquent \Model ;
10+ use Illuminate \Database \Eloquent \Relations \Relation ;
911use Illuminate \Http \Request ;
1012use Illuminate \Support \Arr ;
1113use Illuminate \Support \Collection ;
1214use Illuminate \Support \Str ;
1315use Makeable \ApiEndpoints \Concerns \AddsAppendsToQuery ;
1416use Makeable \ApiEndpoints \Concerns \NormalizesRelationNames ;
17+ use Spatie \QueryBuilder \AllowedInclude ;
1518use Spatie \QueryBuilder \QueryBuilder as SpatieBuilder ;
1619
1720class QueryBuilder extends SpatieBuilder
@@ -21,6 +24,15 @@ class QueryBuilder extends SpatieBuilder
2124 allowedAppends as originalAllowedAppends;
2225 }
2326
27+ public function __construct (
28+ protected Relation |EloquentBuilder $ subject ,
29+ ?Request $ request = null
30+ ) {
31+ $ this ->request = $ request
32+ ? QueryBuilderRequest::fromRequest ($ request )
33+ : app (QueryBuilderRequest::class);
34+ }
35+
2436 /**
2537 * @var array
2638 */
@@ -47,27 +59,14 @@ public function __call($name, $arguments)
4759 return $ result ;
4860 }
4961
50- /**
51- * @param Request|null $request
52- * @return QueryBuilder
53- */
54- protected function initializeRequest (?Request $ request = null ): static
55- {
56- $ this ->request = $ request
57- ? QueryBuilderRequest::fromRequest ($ request )
58- : app (QueryBuilderRequest::class);
59-
60- return $ this ;
61- }
62-
6362 /**
6463 * @param $appends
6564 * @return QueryBuilder
6665 */
6766 public function allowedAppends ($ appends ): static
6867 {
6968 collect ($ appends )
70- ->mapWithKeys (Closure:: fromCallable ([ $ this , ' normalizeRelationQueries ' ] ))
69+ ->flatMap ( fn ( $ constraints , $ relation ) => $ this -> normalizeRelationQueries ( $ constraints , $ relation ))
7170 ->tap (function (Collection $ appends ) {
7271 $ this ->originalAllowedAppends ($ appends ->keys ()->all ());
7372 })
@@ -129,7 +128,7 @@ protected function addAppendsToResults(Collection $results, Collection $appends
129128 public function allowedIncludes ($ includes ): static
130129 {
131130 collect ($ includes )
132- ->mapWithKeys (Closure:: fromCallable ([ $ this , ' normalizeRelationQueries ' ] ))
131+ ->flatMap ( fn ( $ constraints , $ relation ) => $ this -> normalizeRelationQueries ( $ constraints , $ relation ))
133132 ->mapWithKeys (fn ($ constraints , $ relation ) => [$ this ->normalizeRelationName ($ relation ) => $ constraints ])
134133 ->tap (function (Collection $ includes ) {
135134 $ this ->queueConstraints ($ includes );
@@ -244,12 +243,20 @@ protected function mergeConstraints(...$constraints): Closure
244243 * @param $relation
245244 * @return array
246245 */
247- protected function normalizeRelationQueries ($ constraints , $ relation ): array
246+ protected function normalizeRelationQueries ($ constraints , $ relation ): Collection
248247 {
249- if (is_numeric ($ relation )) {
248+ // Currently not working as intended
249+ // // Support AllowedInclude::relationship() which returns a Collection of AllowedInclude
250+ // if (is_numeric($relation) && is_array($constraints) && count($constraints) === 1 && $constraints[0] instanceof Collection) {
251+ // return $constraints[0]->mapWithKeys(function (AllowedInclude $include) {
252+ // return [$include->getName() => [fn ($query) => $include->include($query)]];
253+ // });
254+ // }
255+
256+ if (is_numeric ($ relation ) && is_string ($ constraints )) {
250257 [$ constraints , $ relation ] = [[], $ constraints ];
251258 }
252259
253- return [$ relation => $ constraints ];
260+ return collect ( [$ relation => $ constraints ]) ;
254261 }
255262}
0 commit comments