msantang / query-filters
Laravel 4|5 查询过滤器,支持验证和关系
v0.2.6
2017-06-20 19:37 UTC
Requires
- php: >=5.4.0
- illuminate/console: ~5.1
- illuminate/database: ~5.1
- illuminate/support: ~5.1
- illuminate/validation: ~5.1
Requires (Dev)
- mockery/mockery: ^0.9.5
- phpunit/phpunit: ~5.7
This package is auto-updated.
Last update: 2024-09-06 01:54:25 UTC
README
以简单、清晰的方式过滤 Eloquent 模型。
您可以使用如下 URL 调用过滤模型:
/users/?created_from=2017-01-01&created_to=2017-01-01&roles_name=Admin
/users/?id=2
/users/?id[]=1&id[]=3&id[]=6
只需使用
#!php
<?php
Route::get('user/', function () {
return App\User::filter()->get();
});
特性
- 输入值验证
- 支持多字段过滤
- 通过关系过滤远程字段
- 通过类或闭包自定义过滤类型
安装
使用 Composer 需要安装
composer require msantang/query-filters 0.2.*
将服务提供者添加到 config/app.php(如果您想使用 creator 命令)
Msantang\QueryFilters\QueryFiltersServiceProvider::class,
用法
创建 Filter 和 InputFilter
php artisan queryfilter:make User
默认情况下,这将创建两个文件
App/QueryFilters/UserFilter.php
#!php
<?php namespace App\QueryFilters;
use Msantang\QueryFilters\Filter;
class UserFilter extends Filter
{
protected $filters = [
// field type:operation
'created_at' => 'date:from|date:to', // multiple filter
'name' => 'string:begin',
'roles.name' => 'string:contains', // filter on joined model (Roles)
'id' => 'numeric:eq'
];
}
和 App/QueryFilters/UserFilterInput.php
#!php
<?php namespace App\QueryFilters;
use Msantang\QueryFilters\FilterInput;
class UserFilterInput extends FilterInput
{
// mapping from input to filter values
protected $mapping = [
// field input name
'id' => 'id',
'created_at' => 'desde|hasta', // multiple filters
'name' => 'name',
'roles.name' => 'roles_name' // filter a joined model (user relation)
];
// input validation
protected $rules = [
'id' => 'integer',
'desde' => 'date',
'hasta' => 'date',
'name' => 'string',
'roles.name' => 'string'
];
}
将 Filterable 添加到您的模型中
默认情况下,模型将寻找 App(QueryFilters{Model}Filter 和 App(QueryFilters{Model}FilterInput。如果您想覆盖此设置,只需发布包配置并更改 queryfilter.php 配置文件中的命名空间。或者设置 protected $filter_class 和 $filter_input_class 属性;
#!php
<?php
namespace App;
use Msantang\QueryFilters\Filterable;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use Filterable;
}
使用过滤作用域
#!php
<?php
Route::get('user/', function () {
return App\User::filter()->get();
});
更改字段过滤器的操作
如果您有一个类似这样的过滤器
#!php
<?php
$mapping = [
'id' => 'byid',
];
$filter = [
'id' => 'numeric:eq'
]
然后您可以动态更改操作如下
/users/?byid=2&byid_opt=neq
通过发送带有名称 {mapping_name}_opt = operation 的请求参数
使用构造函数
#!php
<?php
// mapping from input to filter values
$mapping = [
'created_at' => 'created_from|created_to', // multiple filters
'id' => 'id',
'roles.name' => 'roles_name' // filter a joined model (roles relation)
];
// input validation
$rules = [
'created_from' => 'date',
'created_to' => 'date',
'id' => 'integer',
'roles.name' => 'string'
];
// make filter input from request
$input = FilterInput::fromRequest( $mapping, null, $rules );
// Same as
// $input = new FilterInput(request(), $mapping, null, $rules);
// validate filter inputs
if (!$input->validate()) {
// do something with message bag
dd($input->messages());
return;
};
// construct filters
$filter = new Filter([
//field field filters
'created_at' => 'date:from|date:to',
'id' => 'numeric:eq',
'roles.name' => 'string:contains'
]);
$query = User::query();
// apply filter to query
$filter->apply($query, $input);
return $query->get();
过滤类型##
数字
字符串
日期
日期时间
创建自定义字段过滤器
尽管有内置字段过滤器,但您也可以添加自己的过滤器。
闭包
#!php
<?php
$filters = [
'created_at' => 'date:from|date:to',
'id' => [function($query, $value, $name, $opt ){
$query->where($name, $value);
}]
];
类
#!php
<?php
use Msantang\QueryFilters\Contracts\ParameterFilterInterface;
use Msantang\QueryFilters\ParameterFilter\AbstractParameterFilter;
class MyFilter extends AbstractParameterFilter implements ParameterFilterInterface
{
public function apply($query, $value, $name, $opt = null)
{
if (empty($opt)) $opt[0] = 'eq';
switch ($opt[0]) {
case 'eq':
$query->where($name,'=', $value);
break;
default:
$query->where($name,'like', "%$value%");
break;
}
}
}
#!php
<?php
$f = new Filter([
'created_at' => 'date:from|date:to',
'name' => 'string:begin',
'roles.name' => 'string:contains',
'id' => [new MyFilter]
]);
许可证
本项目采用 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。