PluginProbe
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler / 1.6.4
FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler v1.6.4
1.6.4 1.6.3 1.6.2 1.6.1 1.6.0 1.5.4 1.5.5 1.5.3 1.5.2 1.5.1 1.5.0 1.4.2 1.4.1 1.4.0 1.3.28 1.3.27 1.3.26 1.3.25 1.3.23 1.3.22 1.3.21 1.3.20 1.3.19 trunk 1.2.0 All 47 releases
fluent-cart / app / Models / Concerns / CanSearch.php

CanSearch.php in FluentCart A New Era of eCommerce – Faster, Lighter, and Simpler 1.6.4, at app/Models/Concerns/CanSearch.php

248 lines 7.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCart\App\Models\Concerns;
4
5 use FluentCart\Framework\Database\Orm\Builder;
6 use FluentCart\Framework\Support\Arr;
7
8 /**
9 * @method static Builder search(array $query = [])
10 * @see dev-docs/search-trait.md
11 */
12 trait CanSearch
13 {
14 /**
15 * WHERE $column LIKE %$value% query.
16 *
17 * @param Builder $query
18 * @param $column
19 * @param $value
20 * @param string $boolean
21 *
22 * @return Builder
23 */
24 public function scopeWhereLike(Builder $query, $column, $value, string $boolean = 'and'): Builder
25 {
26 return $query->where($column, 'LIKE', "%$value%", $boolean);
27 }
28
29 /**
30 * WHERE $column LIKE $value% query.
31 *
32 * @param Builder $query
33 * @param $column
34 * @param $value
35 * @param string $boolean
36 *
37 * @return Builder
38 */
39 public function scopeWhereBeginsWith(Builder $query, $column, $value, string $boolean = 'and'): Builder
40 {
41 return $query->where($column, 'LIKE', "$value%", $boolean);
42 }
43
44 /**
45 * WHERE $column LIKE %$value query.
46 *
47 * @param Builder $query
48 * @param $column
49 * @param $value
50 * @param string $boolean
51 *
52 * @return Builder
53 */
54 public function scopeWhereEndsWith(Builder $query, $column, $value, string $boolean = 'and'): Builder
55 {
56 return $query->where($column, 'LIKE', "%$value", $boolean);
57 }
58
59 /**
60 * @param array $params
61 * @param Builder $query
62 *
63 * @return Builder
64 */
65 public function scopeSearch(Builder $query, array $params): Builder
66 {
67 $searchable = $this->getSearchable();
68
69 $new_params = [];
70
71 foreach ($params as $key => $_param) {
72 $param = [];
73 if (is_array($_param)) {
74 $param['column'] = Arr::get($_param, 'column', $key);
75 $param['operator'] = Arr::get($_param, 'operator', '=');
76 $param['value'] = Arr::get($_param, 'value', null);
77
78 } else {
79 if ($_param == null) {
80 continue;
81 }
82 $param['column'] = $key;
83 $param['operator'] = '=';
84 $param['value'] = $_param;
85 }
86
87 if ($param['value'] == null) {
88 continue;
89 }
90
91 $new_params[$param['column']] = $param;
92 }
93
94 $params = [];
95 if ($searchable) {
96 foreach ($searchable as $search) {
97 if (isset($new_params[$search])) {
98 $params[] = $new_params[$search];
99 }
100 }
101 } else {
102 $params = $new_params;
103 unset($new_params);
104 }
105
106 if (is_array($params)) {
107 foreach ($params as $key => $param) {
108
109 switch (strtolower($param['operator'])) {
110
111 case 'between':
112 $query->whereBetween($param['column'], $param['value']);
113 break;
114 case 'or_between':
115 $query->orWhereBetween($param['column'], $param['value']);
116 break;
117
118 case 'not_between':
119 $query->whereNotBetween($param['column'], $param['value']);
120 break;
121 case 'or_not_between':
122 $query->orWhereNotBetween($param['column'], $param['value']);
123 break;
124
125 case 'is_null':
126 $query->whereNull($param['column']);
127 break;
128 case 'or_is_null':
129 $query->orWhereNull($param['column']);
130 break;
131
132 case 'is_not_null':
133 $query->whereNotNull($param['column']);
134 break;
135 case 'or_is_not_null':
136 $query->orWhereNotNull($param['column']);
137 break;
138
139 case 'like_all':
140 $query->where($param['column'], 'like', '%' . $param['value'] . '%');
141 break;
142
143 case 'or_like_all':
144 $query->orWhere($param['column'], 'like', '%' . $param['value'] . '%');
145 break;
146
147 case 'llike':
148 $query->where($param['column'], 'like', '%' . $param['value']);
149 break;
150 case 'or_llike':
151 $query->orWhere($param['column'], 'like', '%' . $param['value']);
152 break;
153
154 case 'rlike':
155 $query->where($param['column'], 'like', $param['value'] . '%');
156 break;
157 case 'or_rlike':
158 $query->orWhere($param['column'], 'like', $param['value'] . '%');
159 break;
160
161 case 'not_like':
162 $query->where($param['column'], 'not like', '%' . $param['value'] . '%');
163 break;
164
165 case 'in':
166 $query->whereIn($param['column'], $param['value']);
167 break;
168
169 case 'not_in':
170 $query->whereNotIn($param['column'], $param['value']);
171 break;
172
173 case 'or_in':
174 $query->orWhereIn($param['column'], $param['value']);
175 break;
176
177 case 'or_where':
178 $query->orWhere($param['column'], $param['value']);
179 break;
180 case 'where':
181 $query->where($param['column'], $param['value']);
182 break;
183
184 default:
185 $query->where($param['column'], $param['operator'], $param['value']);
186 }
187 }
188 }
189
190 return $query;
191 }
192
193 /**
194 * @param Builder $query
195 * @param array $groups
196 *
197 * @return Builder
198 */
199 public function scopeGroupSearch(Builder $query, array $groups): Builder
200 {
201 $class = get_class($this);
202 $className = basename(str_replace('\\', '/', $class));
203
204 $new_groups = [];
205 foreach ($groups as $key => $group) {
206 $arr = explode('.', $key);
207 $new_groups[$arr[0]] = $group;
208 }
209
210 unset($groups);
211
212 foreach ($new_groups as $key => $params) {
213 if ($key == $this->getTable() || strtolower($key) == strtolower($className)) {
214 $query->search($params);
215 } else {
216 if (!$this->checkValueIsNull($params)) {
217 $query->whereHas($key, function ($query) use ($params) {
218 $query->search($params);
219 });
220 }
221 }
222 }
223
224 return $query;
225 }
226
227 /**
228 * @param array $params
229 * @return bool
230 */
231 private function checkValueIsNull(array $params): bool
232 {
233 foreach ($params as $key => $param) {
234 if ($param['value'] != '') {
235 return false;
236 }
237 }
238
239 return true;
240 }
241
242 public function getSearchable(): array
243 {
244 return [];
245 }
246
247
248 }