Skip to content

Commit

Permalink
fix: 简化 search 参数
Browse files Browse the repository at this point in the history
  • Loading branch information
westhack committed Jun 16, 2019
1 parent b24ea76 commit 49cd2dd
Show file tree
Hide file tree
Showing 2 changed files with 157 additions and 12 deletions.
147 changes: 146 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,147 @@
# laravel-eloquent-search
laravel eloquent search

一个简化 laravel model 筛选条件的库

## 介绍
如果我们想返回由多个参数筛选的用户列表:

`/users?username=er&group_id=2&roles[]=1&roles[]=4&roles[]=7&created_at[]=2019-03-05&created_at[]=2019-03-06`

`$request->all()` 的结果:
```php
[
'username' => 'er',
'group_id' => '2',
'roles' => ['1','4','7'],
"created_at" => ["2019-03-05", "2019-03-06"]
]
```

要根据这些参数进行筛选,我们需要做如下工作:

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;

class UserController extends Controller
{

public function index(Request $request)
{
$query = User::where('group_id', $request->input('group_id'));

if ($request->has('username'))
{
$query->where('username', 'LIKE', '%' . $request->input('username') . '%');
}

if ($request->has('created_at'))
{
$query->whereBetween('created_at', $request->input('created_at'));
}

$query->whereHas('roles', function ($q) use ($request)
{
return $q->whereIn('id', $request->input('roles'));
});

return $query->get();
}

}
```

## 我们使用 laravel-eloquent-search 来减少工作量

##### model 引入 search trait
```php
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use EloquentSearch\SearchTrait;

class User extends Model
{
use SearchTrait;
}
```

##### User Controller

```php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;

class UserController extends BaseController
{
public function index(Request $request)
{
return User::search($request->all())->get();
}
}
```

##### 请求示例

```javascript
let search = {

"name": {
"column": "username",
"operator": "like",
"value": "er"
},
"group_id": {
"column": "group_id",
"operator": "=",
"value": "2"
},
"roles": {
"column": "roles",
"operator": "in",
"value": ["1","4","7"],
},
"created_at": {
"column": "created_at",
"operator": "between",
"value": ["2019-03-05", "2019-03-06"]
}

}

// or

let search = {

"name:like": "er",
"group_id:=": 2,
"roles:in": ["1","4","7"],
"created_at:between": ["2019-03-05", "2019-03-06"]

}

axios.post('http://127.0.0.1:8000/users', search)
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});

```

## 安装
```bash
composer require westhack/laravel-eloquent-search
```
22 changes: 11 additions & 11 deletions src/SearchTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,27 +63,27 @@ public function scopeSearch($query, $params)
if (is_array($_param)) {
$param['column'] = array_get($_param, 'column', $key);
$param['operator'] = array_get($_param, 'operator', '=');
$param['values'] = array_get($_param, 'values', null);
$param['value'] = array_get($_param, 'value', null);

} else {
if ($_param == null) {
continue;
}
$param['column'] = $key;
$param['operator'] = '=';
$param['values'] = $_param;
$param['value'] = $_param;
}

if ($param['values'] == null) {
if ($param['value'] == null) {
continue;
}

switch (strtolower($param['operator'])) {
case 'between':
$query->whereBetween($param['column'], $param['values']);
$query->whereBetween($param['column'], $param['value']);
break;
case 'not between':
$query->whereNotBetween($param['column'], $param['values']);
$query->whereNotBetween($param['column'], $param['value']);
break;
case 'is null':
$query->whereNull($param['column']);
Expand All @@ -92,19 +92,19 @@ public function scopeSearch($query, $params)
$query->whereNotNull($param['column']);
break;
case 'like all':
$query->whereLike($param['column'], $param['values']);
$query->whereLike($param['column'], $param['value']);
break;
case 'begin with':
$query->whereBeginsWith($param['column'], $param['values']);
$query->whereBeginsWith($param['column'], $param['value']);
break;
case 'end with':
$query->whereEndsWith($param['column'], $param['values']);
$query->whereEndsWith($param['column'], $param['value']);
break;
case 'in':
$query->whereIn($param['column'], $param['values']);
$query->whereIn($param['column'], $param['value']);
break;
default:
$query->where($param['column'], $param['operator'], $param['values']);
$query->where($param['column'], $param['operator'], $param['value']);
}
}
}
Expand Down Expand Up @@ -154,7 +154,7 @@ public function scopeGroupSearch($query, array $groups)
private function checkValueIsNull(array $params)
{
foreach ($params as $key => $param) {
if ($param['values'] != '') {
if ($param['value'] != '') {
return false;
}
}
Expand Down

0 comments on commit 49cd2dd

Please sign in to comment.