FiltersScope   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 43
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

Changes 0
Metric Value
wmc 6
lcom 0
cbo 4
dl 0
loc 43
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __invoke() 0 9 1
A resolveParameters() 0 30 5
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 ReflectionException;
10
use ReflectionObject;
11
use Spatie\QueryBuilder\Exceptions\InvalidFilterValue;
12
13
class FiltersScope implements Filter
14
{
15
    public function __invoke(Builder $query, $values, string $property): Builder
16
    {
17
        $scope = Str::camel($property);
18
19
        $values = array_values(Arr::wrap($values));
20
        $values = $this->resolveParameters($query, $values, $scope);
21
22
        return $query->$scope(...$values);
23
    }
24
25
    protected function resolveParameters(Builder $query, $values, string $scope): array
26
    {
27
        try {
28
            $parameters = (new ReflectionObject($query->getModel()))
29
                ->getMethod('scope'.ucfirst($scope))
30
                ->getParameters();
31
        } catch (ReflectionException $e) {
32
            return $values;
33
        }
34
35
        foreach ($parameters as $parameter) {
36
            if (! optional($parameter->getClass())->isSubclassOf(Model::class)) {
37
                continue;
38
            }
39
40
            $model = $parameter->getClass()->newInstance();
41
            $index = $parameter->getPosition() - 1;
42
            $value = $values[$index];
43
44
            $result = $model->resolveRouteBinding($value);
45
46
            if ($result === null) {
47
                throw InvalidFilterValue::make($value);
48
            }
49
50
            $values[$index] = $result;
51
        }
52
53
        return $values;
54
    }
55
}
56