Completed
Push — master ( c4bcc6...c033be )
by Michael
04:57
created

SearchTrait   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 3
dl 0
loc 106
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A checkSearchFields() 0 14 4
B checkSearchField() 0 14 5
A searchRelation() 0 22 1
A searchThis() 0 11 1
1
<?php
2
3
namespace Blasttech\EloquentRelatedPlus;
4
5
use Illuminate\Database\Eloquent\Builder;
6
use Illuminate\Database\Eloquent\Model;
7
8
trait SearchTrait
9
{
10
    use RelatedPlusTrait;
11
12
    /**
13
     * Add where statements for search fields to search for searchText
14
     *
15
     * @param Builder $query
16
     * @param string $searchText
17
     * @return Builder
18
     */
19
    private function checkSearchFields($query, $searchText)
20
    {
21
        return $query->where(function (Builder $query) use ($searchText) {
22
            if (isset($this->search_fields) && !empty($this->search_fields)) {
23
                /** @var Model $this */
24
                $table = $this->getTable();
25
                foreach ($this->search_fields as $searchField => $searchFieldParameters) {
26
                    $query = $this->checkSearchField($query, $table, $searchField, $searchFieldParameters, $searchText);
27
                }
28
            }
29
30
            return $query;
31
        });
32
    }
33
34
    /**
35
     * Add where statement for a search field
36
     *
37
     * @param Builder $query
38
     * @param string $table
39
     * @param string $searchField
40
     * @param array $searchFieldParameters
41
     * @param string $searchText
42
     * @return Builder
43
     */
44
    private function checkSearchField($query, $table, $searchField, $searchFieldParameters, $searchText)
45
    {
46
        if (!isset($searchFieldParameters['regex']) || preg_match($searchFieldParameters['regex'], $searchText)) {
47
            $searchColumn = is_array($searchFieldParameters) ? $searchField : $searchFieldParameters;
48
49
            if (isset($searchFieldParameters['relation'])) {
50
                return $this->searchRelation($query, $searchFieldParameters, $searchColumn, $searchText);
51
            } else {
52
                return $this->searchThis($query, $searchFieldParameters, $table, $searchColumn, $searchText);
53
            }
54
        } else {
55
            return $query;
56
        }
57
    }
58
59
    /**
60
     * Add where condition to search a relation
61
     *
62
     * @param Builder $query
63
     * @param array $searchFieldParameters
64
     * @param string $searchColumn
65
     * @param string $searchText
66
     * @return Builder
67
     */
68
    private function searchRelation(Builder $query, $searchFieldParameters, $searchColumn, $searchText)
69
    {
70
        $relation = $searchFieldParameters['relation'];
71
        $relatedTable = $this->$relation()->getRelated()->getTable();
72
73
        return $query->orWhere(function (Builder $query) use (
74
            $searchText,
75
            $searchColumn,
76
            $searchFieldParameters,
77
            $relation,
78
            $relatedTable
79
        ) {
80
            return $query->orWhereHas($relation, function (Builder $query2) use (
81
                $searchText,
82
                $searchColumn,
83
                $searchFieldParameters,
84
                $relatedTable
85
            ) {
86
                return $query2->where($relatedTable . '.' . $searchColumn, 'like', $searchText . '%');
87
            });
88
        });
89
    }
90
91
    /**
92
     * Add where condition to search current model
93
     *
94
     * @param Builder $query
95
     * @param array $searchFieldParameters
96
     * @param string $table
97
     * @param string $searchColumn
98
     * @param string $searchText
99
     * @return Builder
100
     */
101
    public function searchThis(Builder $query, $searchFieldParameters, $table, $searchColumn, $searchText)
102
    {
103
        $searchOperator = $searchFieldParameters['operator'] ?? 'like';
104
        $searchValue = $searchFieldParameters['value'] ?? '%{{search}}%';
105
106
        return $query->orWhere(
107
            $table . '.' . $searchColumn,
108
            $searchOperator,
109
            str_replace('{{search}}', $searchText, $searchValue)
110
        );
111
    }
112
113
}