msantang/query-filters

Laravel 4|5 查询过滤器,支持验证和关系

v0.2.6 2017-06-20 19:37 UTC

This package is auto-updated.

Last update: 2024-09-06 01:54:25 UTC


README

Latest Stable Version Total Downloads License StyleCI Build Status

以简单、清晰的方式过滤 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 文件。