Passed
Push — feature/optimize ( cf938e...7e8046 )
by Fu
03:43
created

ParseSearchOrClosureTrait::parseSearchOrClosure()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 30
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 26
nc 4
nop 3
dl 0
loc 30
rs 9.504
c 0
b 0
f 0
1
<?php
2
3
4
namespace Modules\Core\Traits\Criteria;
5
6
7
use Illuminate\Database\Eloquent\Builder;
8
9
trait ParseSearchOrClosureTrait
10
{
11
    /** @var \Illuminate\Http\Request $request */
12
    protected $request;
13
    /** @var \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Query\Builder $model */
14
    protected $model;
15
    /** @var \Prettus\Repository\Contracts\RepositoryInterface $repository */
16
    protected $repository;
17
    protected $search;
18
    protected $searchData;
19
    protected $searchFields;
20
    protected $isFirstField;
21
    protected $modelForceAndWhere;
22
    protected $fieldsSearchable;
23
    protected $fields;
24
    protected $filter;
25
    protected $orderBy;
26
    protected $sortedBy;
27
    protected $with;
28
    protected $searchJoin;
29
    protected $acceptedConditions;
30
    protected $originalFields;
31
32
    protected function parseSearchOrClosure($value, $field, $condition)
33
    {
34
        $modelTableName = $this->model->getModel()->getTable();
35
        switch ($condition) {
36
            case 'in':
37
                $this->model = $this->model->orWhereIn($modelTableName.'.'.$field, $value);
38
                break;
39
            case 'between':
40
                $this->model = $this->model->orWhereBetween($modelTableName.'.'.$field, $value);
41
                break;
42
            case 'cross':
43
                $this->model = $this->model->orWhere(function (Builder $query) use ($field, $value) {
44
                    $query->where(function (Builder $query) use ($field, $value) {
45
                        $query->where("{$field}_min", '<=', $value[0])
46
                              ->where("{$field}_max", '>=', $value[1]);
47
                    })->orWhere(function (Builder $query) use ($field, $value) {
48
                        $query->where("{$field}_min", '<=', $value[0])
49
                              ->where("{$field}_max", '>=', $value[0]);
50
                    })->orWhere(function (Builder $query) use ($field, $value) {
51
                        $query->where("{$field}_min", '>=', $value[0])
52
                              ->where("{$field}_max", '<=', $value[1]);
53
                    })->orWhere(function (Builder $query) use ($field, $value) {
54
                        $query->where("{$field}_min", '>=', $value[0])
55
                              ->where("{$field}_max", '>=', $value[1])
56
                              ->where("{$field}_min", '<=', $value[1]);
57
                    });
58
                });
59
                break;
60
            default:
61
                $this->model = $this->model->orWhere($modelTableName.'.'.$field, $condition, $value);
62
        }
63
    }
64
}