Completed
Pull Request — master (#415)
by
unknown
01:15
created

FiltersScope::resolveParameters()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 9.1608
c 0
b 0
f 0
cc 5
nc 5
nop 3
1
<?php
2
3
namespace Spatie\QueryBuilder\Filters;
4
5
use Spatie\QueryBuilder\Exceptions\InvalidFilterValue;
6
use Illuminate\Database\Eloquent\Builder;
7
use Illuminate\Database\Eloquent\Model;
8
use Illuminate\Support\Arr;
9
use Illuminate\Support\Str;
10
use ReflectionObject;
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
            if (is_numeric($value)) {
40
                $result = $model::find($value);
41
42
                if ($result === null) {
43
                    throw InvalidFilterValue::make($value);
44
                }
45
46
                $values[$index] = $result;
47
            }
48
        }
49
50
        return $values;
51
    }
52
}
53