Completed
Push — master ( 69bb37...3ea6ae )
by Denis
01:17
created

EloquentDataProvider::baseQuery()   B

Complexity

Conditions 9
Paths 4

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 9
nc 4
nop 1
dl 0
loc 21
rs 8.0555
c 0
b 0
f 0
1
<?php
2
3
namespace Woo\GridView\DataProviders;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Woo\GridView\Exceptions\GridViewConfigException;
7
use Woo\GridView\GridViewRequest;
8
9
class EloquentDataProvider extends BaseDataProvider
10
{
11
    protected $filters = false;
12
    protected $ordering = false;
13
14
    protected $query;
15
16
    /**
17
     * EloquentDataProvider constructor.
18
     * @param Builder $query
19
     */
20
    public function __construct(Builder $query)
21
    {
22
        $this->query = clone $query;
23
    }
24
25
    /**
26
     * Applies filter to a column
27
     * @param \Closure| $filter
28
     * @param string $fieldName
29
     * @param Builder $query
30
     * @param mixed $value
31
     * @return void
32
     */
33
    private function applyFilter($filter, string $fieldName, Builder $query, $value)
34
    {
35
        if (is_callable($filter)) {
36
           $filter($query, $value);
37
           return;
38
        }
39
40
        switch ($filter) {
41
            case '=':
42
                $query->where($fieldName, '=', $value);
43
                break;
44
45
            case 'like':
46
                $query->where($fieldName, 'LIKE', '%' . $value . '%');
47
                break;
48
49
            default:
50
                throw new GridViewConfigException('Unknown filter type: ' . $filter);
51
        }
52
    }
53
54
    /**
55
     * @param GridViewRequest $request
56
     * @return Builder
57
     */
58
    protected function baseQuery(GridViewRequest $request)
59
    {
60
        $query = clone $this->query;
61
62
        if ($this->filters !== false) {
63
            foreach ($request->filters as $field => $value) {
64
                if ($this->filters === true || in_array($field, $this->filters)) {
65
                    $query->where($field, 'LIKE', '%' . $value . '%');
66
67
                } elseif (!empty($this->filters[$field])) {
68
                    $this->applyFilter($this->filters[$field], $field, $query, $value);
69
                }
70
            }
71
        }
72
73
        if ($request->sortColumn && ($this->ordering === true || in_array($request->sortColumn, $this->ordering))) {
74
            $query->orderBy($request->sortColumn, $request->sortOrder);
75
        }
76
77
        return $query;
78
    }
79
80
    /**
81
     * @inheritdoc
82
     */
83
    public function getCount(GridViewRequest $request) : int
84
    {
85
        return $this->baseQuery($request)->count();
86
    }
87
88
    /**
89
     * @inheritdoc
90
     */
91
    public function getData(GridViewRequest $request)
92
    {
93
        $query = $this->baseQuery($request);
94
95
        if ($request->perPage == 0) {
96
            return $query->get();
97
        }
98
99
        return $query->offset(($request->page - 1) * $request->perPage)
100
            ->limit($request->perPage)
101
            ->get();
102
    }
103
}
104