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

ParserSearchOrRelationClosureTrait   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 32
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 27
dl 0
loc 32
rs 10
c 0
b 0
f 0
wmc 4

1 Method

Rating   Name   Duplication   Size   Complexity  
A parserSearchOrRelationClosure() 0 30 4
1
<?php
2
3
4
namespace Modules\Core\Traits\Criteria;
5
6
7
use Illuminate\Database\Eloquent\Builder;
8
9
/**
10
 * Trait ParserSearchOrRelationClosureTrait
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 ParserSearchOrRelationClosureTrait
16
{
17
    protected function parserSearchOrRelationClosure($value, $relation, $field, $condition)
18
    {
19
        $this->model = $this->model->orWhereHas($relation, function (Builder $query) use ($field, $condition, $value) {
20
            switch ($condition) {
21
                case 'in':
22
                    $query->whereIn($field, $value);
23
                    break;
24
                case 'between':
25
                    $query->whereBetween($field, $value);
26
                    break;
27
                case 'cross':
28
                    $query->where(function (Builder $query) use ($field, $value) {
29
                        $query->where(function (Builder $query) use ($field, $value) {
30
                            $query->where("{$field}_min", '<=', $value[0])
31
                                  ->where("{$field}_max", '>=', $value[1]);
32
                        })->orWhere(function (Builder $query) use ($field, $value) {
33
                            $query->where("{$field}_min", '<=', $value[0])
34
                                  ->where("{$field}_max", '>=', $value[0]);
35
                        })->orWhere(function (Builder $query) use ($field, $value) {
36
                            $query->where("{$field}_min", '>=', $value[0])
37
                                  ->where("{$field}_max", '<=', $value[1]);
38
                        })->orWhere(function (Builder $query) use ($field, $value) {
39
                            $query->where("{$field}_min", '>=', $value[0])
40
                                  ->where("{$field}_max", '>=', $value[1])
41
                                  ->where("{$field}_min", '<=', $value[1]);
42
                        });
43
                    });
44
                    break;
45
                default:
46
                    $query->where($field, $condition, $value);
47
            }
48
        });
49
    }
50
}