Passed
Push — master ( c8ae8a...7a63f8 )
by Jianhua
03:46
created

Searchable   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 39
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 24
c 1
b 0
f 0
dl 0
loc 39
rs 10
wmc 12

1 Method

Rating   Name   Duplication   Size   Complexity  
C buildQuery() 0 37 12
1
<?php
2
/**
3
 * Date: 2019/2/27 Time: 10:48
4
 *
5
 * @author  Eddy <[email protected]>
6
 * @version v1.0.0
7
 */
8
9
namespace App\Repository;
10
11
use Carbon\Carbon;
12
use Illuminate\Database\Eloquent\Builder;
13
14
trait Searchable
15
{
16
    public static function buildQuery(Builder $query, array $condition)
17
    {
18
        // 获取模型定义的搜索域
19
        $model = $query->getModel();
20
        $searchField = [];
21
        if (property_exists($model, 'searchField')) {
22
            $searchField = $model::$searchField;
23
        }
24
25
        foreach ($condition as $k => $v) {
26
            if (!is_array($v) && isset($searchField[$k]['searchType'])) {
27
                $condition[$k] = [$searchField[$k]['searchType'], $v];
28
            }
29
        }
30
31
        foreach ($condition as $k => $v) {
32
            $type = 'like';
33
            $value = $v;
34
            if (is_array($v)) {
35
                list($type, $value) = $v;
36
            }
37
            $value = trim($value);
38
            // 搜索值为空字符串则忽略该条件
39
            if ($value === '') {
40
                continue;
41
            }
42
43
            if ($k === 'created_at' || $k === 'updated_at') {
44
                $dates = explode(' ~ ', $value);
45
                if (count($dates) === 2) {
46
                    $query->whereBetween($k, [
47
                        Carbon::parse($dates[0])->startOfDay(),
48
                        Carbon::parse($dates[1])->endOfDay(),
49
                    ]);
50
                }
51
            } else {
52
                $query->where($k, $type, $type === 'like' ? "%{$value}%" : $value);
53
            }
54
        }
55
    }
56
}
57