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

FiltersScope::resolveParameters()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
nc 4
nop 3
dl 0
loc 22
rs 9.568
c 0
b 0
f 0
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
11
class FiltersScope implements Filter
12
{
13
    public function __invoke(Builder $query, $values, string $property): Builder
14
    {
15
        $scope = Str::camel($property);
16
17
        $values = Arr::wrap($values);
18
        $values = $this->resolveParameters($query, $values, $scope);
19
20
        return $query->$scope(...$values);
21
    }
22
23
    protected function resolveParameters(Builder $query, $values, string $scope): array
24
    {
25
        $parameters = (new ReflectionObject($query->getModel()))
26
            ->getMethod('scope' . ucfirst($scope))
27
            ->getParameters();
28
29
        foreach ($parameters as $parameter) {
30
            if (! optional($parameter->getClass())->isSubclassOf(Model::class)) {
31
                continue;
32
            }
33
34
            $model = $parameter->getClass()->newInstance();
35
            $index = $parameter->getPosition() - 1;
36
            $value = $values[$index];
37
38
            if (is_numeric($value)) {
39
                $values[$index] = $model::findOrFail($value);
40
            }
41
        }
42
43
        return $values;
44
    }
45
}
46