FilterBuilder::applyFilterQuery()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Gurgentil\EloquentFilters;
4
5
use Illuminate\Database\Eloquent\Builder;
6
7
abstract class FilterBuilder implements Filter
8
{
9
    /**
10
     * Filter maps.
11
     *
12
     * Ex.: ['name' => NameFilter::class]
13
     *
14
     * @var array
15
     */
16
    protected $availableFilters = [];
17
18
    /**
19
     * Apply all filters to the model.
20
     *
21
     * @param Builder $builder
22
     * @param array|null $filters
23
     * @return Builder
24
     */
25
    public function apply(Builder $builder, $filters): Builder
26
    {
27
        if (is_null($filters)) {
28
            return $builder;
29
        }
30
31
        foreach ($filters as $filter => $value) {
32
            if ($this->filterExists($filter)) {
33
                $builder = $this->applyFilterQuery($builder, $filter, $value);
34
            }
35
        }
36
37
        return $builder;
38
    }
39
40
    /**
41
     * Determine whether filter is available.
42
     *
43
     * @param $filter
44
     * @return bool
45
     */
46
    protected function filterExists($filter): bool
47
    {
48
        return array_key_exists($filter, $this->availableFilters);
49
    }
50
51
    /**
52
     * Create filter instance and apply it to the query.
53
     *
54
     * @param Builder $builder
55
     * @param $filter
56
     * @param $value
57
     * @return Builder
58
     */
59
    protected function applyFilterQuery(Builder $builder, $filter, $value): Builder
60
    {
61
        $filterClass = $this->availableFilters[$filter];
62
63
        return (new $filterClass)->apply($builder, $value);
64
    }
65
}
66