Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/huang-yi/laravel-filter
Query filters for Laravel.
https://github.com/huang-yi/laravel-filter
filter laravel query
Last synced: about 16 hours ago
JSON representation
Query filters for Laravel.
- Host: GitHub
- URL: https://github.com/huang-yi/laravel-filter
- Owner: huang-yi
- License: mit
- Created: 2018-07-24T03:43:02.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2018-07-24T04:19:26.000Z (over 6 years ago)
- Last Synced: 2024-11-18T09:42:52.433Z (3 months ago)
- Topics: filter, laravel, query
- Language: PHP
- Homepage:
- Size: 18.6 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README-cn.md
- License: LICENSE
Awesome Lists containing this project
README
# Laravel Filter
这个拓展包帮助开发者快速构建查询过滤器。
## 实例
现在有一个查询用户列表的任务,要求能够按性别、所在城市筛选。
一般情况下,我们可能会提前在Model里定义一系列的scope:
```php
where('gender', $gender);
}
/**
* Scope of cities.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @param array $cityIds
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeCities(Builder $query, $cityIds)
{
return $query->whereIn('city_id', (array) $cityIds);
}
}```
然后在Controller里调用:
```php
input('gender')) {
$query->gender($gender);
}if ($cities = explode(',', $request->input('cities'))) {
$query->cities($cities);
}$users = $query->get();
return $users;
}
}```
这样的实现看着还能接受,但往往现实需求中,需要过滤的往往不止两个条件,而且除了过滤外还有其他的业务逻辑,这样很容易引发Fat Controller的问题。
如果使用了该拓展包,代码是这样的:
1、 定义filter
```php
where('gender', $value);
}
}```
```php
whereIn('cities', $value);
}
}```
2、命名你的filter:
```php
applyFilters($query);$users = $query->get();
return $users;
}
}```
可以看到,虽然我们需要创建多个filter文件,但是Controller里面只需要一行代码就搞定了,所以无论需求有多少个过滤条件,都不会引起
Fat Controller的问题,如此实现是不是更加优雅?开发者可能会担心创建filter很麻烦,不必慌张,你只需要敲一行Artisan命令就能快速创建filter到文件夹`app/Filtres/`,并自动注册
filter名到文件`app/filters.php`文件:```sh
php artisan make:filter user.gender
```## 快速开始
### 安装
使用composer安装:
```sh
composer require huang-yi/laravel-filter
```### 注册服务(可选)
如果你正在使用版本号低于5.5的Laravel,需要手动注册服务,在`config/app.php`中填加:
```php
[
HuangYi\Filter\FilterServiceProvider::class,
],
];```
### 配置(可选)
使用`vendor:publish`命令发布配置文件:
```sh
php artisan vendor:publish --provider="HuangYi\Filter\FilterServiceProvider"
```执行上述命令后,会生成一个`config/filter.php`文件,即为该拓展包的配置文件。
一般来说,我们不需要修改任何配置,除非你有一些特殊的需求。
`key`:前端上传过滤器规则时使用的key,默认为`filters`。
`log_level`:设置日志等级,默认为`debug`。如果你想关闭日志,可以设置为`null`。
`parser`:规律器规则解析器。如果你想修改`filters`的参数格式,可以自行实现parser,但是parser类必须实现`HuangYi\Filter\Contracts\ParserContract`。
### 创建filter
使用命令`make:filter`快速创建filter:
```sh
php artisan make:filter user.gender
```上述命令中`user.gender`为filter的名字,它会自动创建一个filter类到`app/Filters/`文件夹下面,并在文件`app/filters.php`中命名过滤器。
如果你不喜欢使用命令,则可以手动创建:
1、 创建一个filter类,你可以将其放至任何位置,只要满足`psr4`规范,但是它必须实现`HuangYi\Filter\Contracts\FilterContract`。
```php
where('gender', $value);
}
}```
2、 命名你的filter:可以使用`HuangYi\Filter\Facades\Filter`的`name`方法来命名,默认系统会自动加载
`app/filters.php`,所以你可以在这个文件内进行命名。但你也可以在任意文件中执行,只要这个文件被系统require。```php
apply()`。```php
apply($query);
return $query->get();
});
```### 前端构造filters规则
单个filter的结构:
```javascript
let filter = {
name: "user.gender",
value: "female"
}
```然后将多个filter组合在一起,并生成json字符串:
```javascript
let filters = JSON.stringify([
{
name: "user.gender",
value: "female"
},
{
name: "user.cities",
value: [1, 2, 3]
}
]);
```最后将json字符串做base64处理后发送给服务端:
```javascript
let Base64 = require('js-base64').Base64;
let axios = require('axios');filters = Base64.encode(filters);
axios.get('/users', {
filters: filters
}).then((response) => {
console.log(response);
});
```## License
Laravel Filter遵循[The MIT License (MIT)](http://opensource.org/licenses/MIT)开源许可。