Completed
Push — master ( 0bbd02...0f69a3 )
by Hamidreza
01:23
created

Filters   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 0
Metric Value
wmc 9
lcom 1
cbo 2
dl 0
loc 84
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A apply() 0 16 4
A getFilters() 0 6 1
A orderBy() 0 11 3
1
<?php
2
3
namespace App\Filters;
4
5
use Illuminate\Http\Request;
6
7
abstract class Filters
8
{
9
    /**
10
     * @var Request
11
     */
12
    protected $request;
13
14
    /**
15
     * The Eloquent builder.
16
     *
17
     * @var \Illuminate\Database\Eloquent\Builder
18
     */
19
    protected $builder;
20
21
    /**
22
     * Registered filters to operate upon.
23
     *
24
     * @var array
25
     */
26
    protected $filters = [];
27
28
    /**
29
     * Create a new ThreadFilters instance.
30
     *
31
     * @param Request $request
32
     */
33
    public function __construct(Request $request)
0 ignored issues
show
Bug introduced by
You have injected the Request via parameter $request. This is generally not recommended as there might be multiple instances during a request cycle (f.e. when using sub-requests). Instead, it is recommended to inject the RequestStack and retrieve the current request each time you need it via getCurrentRequest().
Loading history...
34
    {
35
        $this->request = $request;
36
    }
37
38
    /**
39
     * Apply the filters.
40
     *
41
     * @param  \Illuminate\Database\Eloquent\Builder $builder
42
     * @return \Illuminate\Database\Eloquent\Builder
43
     */
44
    public function apply($builder)
45
    {
46
        $this->builder = $builder;
47
48
        foreach ($this->getFilters() as $filter => $value) {
49
            if (method_exists($this, $filter)) {
50
                $this->$filter($value);
51
            }
52
        }
53
54
        if ($this->request->filled('orderBy')) {
55
            $this->orderBy($this->request->orderBy);
56
        }
57
58
        return $this->builder;
59
    }
60
61
    /**
62
     * Fetch all relevant filters from the request.
63
     *
64
     * @return array
65
     */
66
    public function getFilters()
67
    {
68
        return array_filter($this->request->only($this->filters), function ($item) {
69
            return !is_null($item);
70
        });
71
    }
72
73
    /**
74
     * Order the query by givens orders
75
     *
76
     * @param $orders
77
     * @return \Illuminate\Database\Eloquent\Builder
78
     */
79
    protected function orderBy($orders)
80
    {
81
        if (! is_array($orders)) {
82
            $orders = json_decode($orders, true);
83
        }
84
        return $this->builder->when(! empty($orders), function ($query) use ($orders) {
85
            foreach ($orders as $key => $order) {
86
                $query->orderBy($key, $order);
87
            }
88
        });
89
    }
90
}