Skip to content

Commit 49cd2dd

Browse files
committed
fix: 简化 search 参数
1 parent b24ea76 commit 49cd2dd

File tree

2 files changed

+157
-12
lines changed

2 files changed

+157
-12
lines changed

README.md

Lines changed: 146 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,147 @@
11
# laravel-eloquent-search
2-
laravel eloquent search
2+
3+
一个简化 laravel model 筛选条件的库
4+
5+
## 介绍
6+
如果我们想返回由多个参数筛选的用户列表:
7+
8+
`/users?username=er&group_id=2&roles[]=1&roles[]=4&roles[]=7&created_at[]=2019-03-05&created_at[]=2019-03-06`
9+
10+
`$request->all()` 的结果:
11+
```php
12+
[
13+
'username' => 'er',
14+
'group_id' => '2',
15+
'roles' => ['1','4','7'],
16+
"created_at" => ["2019-03-05", "2019-03-06"]
17+
]
18+
```
19+
20+
要根据这些参数进行筛选,我们需要做如下工作:
21+
22+
```php
23+
<?php
24+
25+
namespace App\Http\Controllers;
26+
27+
use Illuminate\Http\Request;
28+
use App\Http\Requests;
29+
use App\User;
30+
31+
class UserController extends Controller
32+
{
33+
34+
public function index(Request $request)
35+
{
36+
$query = User::where('group_id', $request->input('group_id'));
37+
38+
if ($request->has('username'))
39+
{
40+
$query->where('username', 'LIKE', '%' . $request->input('username') . '%');
41+
}
42+
43+
if ($request->has('created_at'))
44+
{
45+
$query->whereBetween('created_at', $request->input('created_at'));
46+
}
47+
48+
$query->whereHas('roles', function ($q) use ($request)
49+
{
50+
return $q->whereIn('id', $request->input('roles'));
51+
});
52+
53+
return $query->get();
54+
}
55+
56+
}
57+
```
58+
59+
## 我们使用 laravel-eloquent-search 来减少工作量
60+
61+
##### model 引入 search trait
62+
```php
63+
<?php
64+
namespace App\Models;
65+
66+
use Illuminate\Database\Eloquent\Model;
67+
use EloquentSearch\SearchTrait;
68+
69+
class User extends Model
70+
{
71+
use SearchTrait;
72+
}
73+
```
74+
75+
##### User Controller
76+
77+
```php
78+
<?php
79+
80+
namespace App\Http\Controllers;
81+
82+
use Illuminate\Http\Request;
83+
use App\Http\Requests;
84+
use App\User;
85+
86+
class UserController extends BaseController
87+
{
88+
public function index(Request $request)
89+
{
90+
return User::search($request->all())->get();
91+
}
92+
}
93+
```
94+
95+
##### 请求示例
96+
97+
```javascript
98+
let search = {
99+
100+
"name": {
101+
"column": "username",
102+
"operator": "like",
103+
"value": "er"
104+
},
105+
"group_id": {
106+
"column": "group_id",
107+
"operator": "=",
108+
"value": "2"
109+
},
110+
"roles": {
111+
"column": "roles",
112+
"operator": "in",
113+
"value": ["1","4","7"],
114+
},
115+
"created_at": {
116+
"column": "created_at",
117+
"operator": "between",
118+
"value": ["2019-03-05", "2019-03-06"]
119+
}
120+
121+
}
122+
123+
// or
124+
125+
let search = {
126+
127+
"name:like": "er",
128+
"group_id:=": 2,
129+
"roles:in": ["1","4","7"],
130+
"created_at:between": ["2019-03-05", "2019-03-06"]
131+
132+
}
133+
134+
axios.post('http://127.0.0.1:8000/users', search)
135+
.then(function (response) {
136+
console.log(response);
137+
})
138+
.catch(function (error) {
139+
console.log(error);
140+
});
141+
142+
```
143+
144+
## 安装
145+
```bash
146+
composer require westhack/laravel-eloquent-search
147+
```

src/SearchTrait.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,27 +63,27 @@ public function scopeSearch($query, $params)
6363
if (is_array($_param)) {
6464
$param['column'] = array_get($_param, 'column', $key);
6565
$param['operator'] = array_get($_param, 'operator', '=');
66-
$param['values'] = array_get($_param, 'values', null);
66+
$param['value'] = array_get($_param, 'value', null);
6767

6868
} else {
6969
if ($_param == null) {
7070
continue;
7171
}
7272
$param['column'] = $key;
7373
$param['operator'] = '=';
74-
$param['values'] = $_param;
74+
$param['value'] = $_param;
7575
}
7676

77-
if ($param['values'] == null) {
77+
if ($param['value'] == null) {
7878
continue;
7979
}
8080

8181
switch (strtolower($param['operator'])) {
8282
case 'between':
83-
$query->whereBetween($param['column'], $param['values']);
83+
$query->whereBetween($param['column'], $param['value']);
8484
break;
8585
case 'not between':
86-
$query->whereNotBetween($param['column'], $param['values']);
86+
$query->whereNotBetween($param['column'], $param['value']);
8787
break;
8888
case 'is null':
8989
$query->whereNull($param['column']);
@@ -92,19 +92,19 @@ public function scopeSearch($query, $params)
9292
$query->whereNotNull($param['column']);
9393
break;
9494
case 'like all':
95-
$query->whereLike($param['column'], $param['values']);
95+
$query->whereLike($param['column'], $param['value']);
9696
break;
9797
case 'begin with':
98-
$query->whereBeginsWith($param['column'], $param['values']);
98+
$query->whereBeginsWith($param['column'], $param['value']);
9999
break;
100100
case 'end with':
101-
$query->whereEndsWith($param['column'], $param['values']);
101+
$query->whereEndsWith($param['column'], $param['value']);
102102
break;
103103
case 'in':
104-
$query->whereIn($param['column'], $param['values']);
104+
$query->whereIn($param['column'], $param['value']);
105105
break;
106106
default:
107-
$query->where($param['column'], $param['operator'], $param['values']);
107+
$query->where($param['column'], $param['operator'], $param['value']);
108108
}
109109
}
110110
}
@@ -154,7 +154,7 @@ public function scopeGroupSearch($query, array $groups)
154154
private function checkValueIsNull(array $params)
155155
{
156156
foreach ($params as $key => $param) {
157-
if ($param['values'] != '') {
157+
if ($param['value'] != '') {
158158
return false;
159159
}
160160
}

0 commit comments

Comments
 (0)