66use Illuminate \Database \Eloquent \Model ;
77use Illuminate \Support \Arr ;
88use Illuminate \Support \Str ;
9+ use ReflectionClass ;
910use ReflectionException ;
1011use ReflectionObject ;
12+ use ReflectionParameter ;
13+ use ReflectionUnionType ;
1114use Spatie \QueryBuilder \Exceptions \InvalidFilterValue ;
1215
1316class FiltersScope implements Filter
@@ -24,7 +27,10 @@ public function __invoke(Builder $query, $values, string $property): Builder
2427 $ relation = $ propertyParts ->implode ('. ' );
2528
2629 if ($ relation ) {
27- return $ query ->whereHas ($ relation , function (Builder $ query ) use ($ scope , $ values ) {
30+ return $ query ->whereHas ($ relation , function (Builder $ query ) use (
31+ $ scope ,
32+ $ values
33+ ) {
2834 return $ query ->$ scope (...$ values );
2935 });
3036 }
@@ -36,18 +42,18 @@ protected function resolveParameters(Builder $query, $values, string $scope): ar
3642 {
3743 try {
3844 $ parameters = (new ReflectionObject ($ query ->getModel ()))
39- ->getMethod ('scope ' . ucfirst ($ scope ))
45+ ->getMethod ('scope ' . ucfirst ($ scope ))
4046 ->getParameters ();
4147 } catch (ReflectionException $ e ) {
4248 return $ values ;
4349 }
4450
4551 foreach ($ parameters as $ parameter ) {
46- if (! optional ($ parameter ->getClass ())->isSubclassOf (Model::class)) {
52+ if (!optional ($ this ->getClass ($ parameter ))->isSubclassOf (Model::class)) {
4753 continue ;
4854 }
4955
50- $ model = $ parameter ->getClass ()->newInstance ();
56+ $ model = $ this ->getClass ($ parameter )->newInstance ();
5157 $ index = $ parameter ->getPosition () - 1 ;
5258 $ value = $ values [$ index ];
5359
@@ -62,4 +68,31 @@ protected function resolveParameters(Builder $query, $values, string $scope): ar
6268
6369 return $ values ;
6470 }
71+
72+ protected function getClass (ReflectionParameter $ parameter ): ?ReflectionClass
73+ {
74+ if (version_compare (PHP_VERSION , '8.0 ' , '< ' )) {
75+ return $ parameter ->getClass ();
76+ }
77+
78+ $ type = $ parameter ->getType ();
79+
80+ if (is_null ($ type )) {
81+ return null ;
82+ }
83+
84+ if ($ type instanceof ReflectionUnionType) {
85+ return null ;
86+ }
87+
88+ if ($ type ->isBuiltin ()) {
89+ return null ;
90+ }
91+
92+ if ($ type ->getName () === 'self ' ) {
93+ return $ parameter ->getDeclaringClass ();
94+ }
95+
96+ return new ReflectionClass ($ type ->getName ());
97+ }
6598}
0 commit comments