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

FiltersScope   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Importance

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

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __invoke() 0 9 1
A resolveParameters() 0 28 5
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