Passed
Push — feature/optimize ( 219eef...0e0305 )
by Fu
03:34
created

parserSearchAndRelationClosure()   A

Complexity

Conditions 4
Paths 1

Size

Total Lines 31
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 27
nc 1
nop 4
dl 0
loc 31
rs 9.488
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
/**
10
 * Trait ParserSearchAndRelationClosureTrait
11
 *
12
 * @property \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Query\Builder $model
13
 * @package Modules\Core\Traits\Criteria
14
 */
15
trait ParserSearchAndRelationClosureTrait
16
{
17
    protected function parserSearchAndRelationClosure($value, $relation, $field, $condition)
18
    {
19
        $this->model =
20
            $this->model->whereHas($relation, function (Builder $query) use ($field, $condition, $value) {
21
                switch ($condition) {
22
                    case 'in':
23
                        $query->whereIn($field, $value);
24
                        break;
25
                    case 'between':
26
                        $query->whereBetween($field, $value);
27
                        break;
28
                    case 'cross':
29
                        $query->where(function (Builder $query) use ($field, $value) {
30
                            $query->where(function (Builder $query) use ($field, $value) {
31
                                $query->where("{$field}_min", '<=', $value[0])
32
                                      ->where("{$field}_max", '>=', $value[1]);
33
                            })->orWhere(function (Builder $query) use ($field, $value) {
34
                                $query->where("{$field}_min", '<=', $value[0])
35
                                      ->where("{$field}_max", '>=', $value[0]);
36
                            })->orWhere(function (Builder $query) use ($field, $value) {
37
                                $query->where("{$field}_min", '>=', $value[0])
38
                                      ->where("{$field}_max", '<=', $value[1]);
39
                            })->orWhere(function (Builder $query) use ($field, $value) {
40
                                $query->where("{$field}_min", '>=', $value[0])
41
                                      ->where("{$field}_max", '>=', $value[1])
42
                                      ->where("{$field}_min", '<=', $value[1]);
43
                            });
44
                        });
45
                        break;
46
                    default:
47
                        $query->where($field, $condition, $value);
48
                }
49
            });
50
    }
51
}