Completed
Push — master ( 100a31...a5694b )
by
unknown
01:53
created

FiltersScope::resolveParameters()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 26
rs 9.504
c 0
b 0
f 0
cc 4
nc 4
nop 3
1
<?php
2
3
namespace Spatie\QueryBuilder\Filters;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
use Illuminate\Support\Arr;
8
use Illuminate\Support\Str;
9
use ReflectionObject;
10
use Spatie\QueryBuilder\Exceptions\InvalidFilterValue;
11
12
class FiltersScope implements Filter
13
{
14
    public function __invoke(Builder $query, $values, string $property): Builder
15
    {
16
        $scope = Str::camel($property);
17
18
        $values = array_values(Arr::wrap($values));
19
        $values = $this->resolveParameters($query, $values, $scope);
20
21
        return $query->$scope(...$values);
22
    }
23
24
    protected function resolveParameters(Builder $query, $values, string $scope): array
25
    {
26
        $parameters = (new ReflectionObject($query->getModel()))
27
            ->getMethod('scope'.ucfirst($scope))
28
            ->getParameters();
29
30
        foreach ($parameters as $parameter) {
31
            if (! optional($parameter->getClass())->isSubclassOf(Model::class)) {
32
                continue;
33
            }
34
35
            $model = $parameter->getClass()->newInstance();
36
            $index = $parameter->getPosition() - 1;
37
            $value = $values[$index];
38
39
            $result = $model->resolveRouteBinding($value);
40
41
            if ($result === null) {
42
                throw InvalidFilterValue::make($value);
43
            }
44
45
            $values[$index] = $result;
46
        }
47
48
        return $values;
49
    }
50
}
51