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

FiltersScope::resolveParameters()   B

Complexity

Conditions 7
Paths 5

Size

Total Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 8.5226
c 0
b 0
f 0
cc 7
nc 5
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
            $keyType = $model->getKeyType();
37
            $index   = $parameter->getPosition() - 1;
38
            $value   = $values[$index];
39
40
            if ($keyType === 'string' || ($keyType === 'int' && is_numeric($value))) {
41
                $result = $model::find($value);
42
43
                if ($result === null) {
44
                    throw InvalidFilterValue::make($value);
45
                }
46
47
                $values[$index] = $result;
48
            }
49
        }
50
51
        return $values;
52
    }
53
}
54