apfelfrisch / query-filter
一个无框架查询过滤器,使用URL参数对查询进行排序和筛选
0.3.1
2024-03-12 15:07 UTC
Requires
- php: ~8.1.0 || ~8.2.0 || ~8.3.0
Requires (Dev)
- doctrine/dbal: ^3.8.3
- friendsofphp/php-cs-fixer: ^3.51
- illuminate/database: ^9.52.16
- infection/infection: ^0.26.21
- phpstan/phpstan: ^1.10.60
- phpstan/phpstan-phpunit: ^1.3.16
- phpunit/phpunit: ^10.5.12
- symfony/var-dumper: ^5.4.36
README
此包提供了一个无框架查询过滤器,允许您根据提供的URL参数进行查询过滤和排序。它内置了对Eloquent和Doctrine QueryBuilder的支持,但也可以扩展以支持其他查询构建工具。内置的URL解析器支持基本的JSON API功能,如果需要,可以更换为自定义解析器。
另一个查询过滤器 - 但为什么?
我在寻找一个查询过滤器,可以将条件构建器与SQL构建器分离,这样就可以在一个位置创建条件,然后传递到另一个位置,这对于将它们添加到存储库中非常有用。此外,我需要编写自定义QueryBuilderAdapter以支持不同的实现,主要是用于与内存存储库一起测试。
安装
composer require apfelfrisch/query-filter
基本用法
按名称过滤John的用户
/users?filter[name]=John
use Apfelfrisch\QueryFilter\QueryFilter; use Apfelfrisch\QueryFilter\Adapters\EloquentQueryBuilder; $queryBuilder = UserModel::query(); // Explicitly parse parameters $users = QueryFilter::new() ->allowFilters('name') ->applyOn($queryBuilder, $request->all()) ->get(); // Implicitly parse parameters over $_GET $users = QueryFilter::new() ->allowFilters('name') ->applyOn($queryBuilder) ->get(); // Obtaining the CriteriaCollection which can be passed into a Repository, for example. $criterias = QueryFilter::new() ->allowFilters('name') ->getCriterias(); $result = $criterias->applyOn(new EloquentQueryBuilder($queryBuilder))
按名称过滤John或Doe的用户
/users?filter[name]=John,Doe
按名称过滤John,按姓氏过滤Doe的用户
/users?filter[name]=John&filter[lastname]=Doe
$users = QueryFilter::new() ->allowFilters('name', 'lastname') ->applyOn($queryBuilder) ->get();
按名称升序排序用户
/users?sort=name
$users = QueryFilter::new() ->allowSorts('name') ->applyOn($queryBuilder) ->get();
按名称升序和按created_at降序排序用户
/users?sort=name,-created_at
$users = QueryFilter::new() ->allowSorts('name', 'created_at') ->applyOn($queryBuilder) ->get();
仅允许特定字段
如果需要,您可以限制选定的字段。如果这样做,您必须通过URI参数指定字段。以下示例中,只选择name和lastname。
/users?fields=name,lastname
$users = QueryFilter::new() ->allowFields('name', 'lastname', 'street') ->applyOn($queryBuilder) ->get();
跳过禁止的条件
默认情况下,此包在请求的筛选器或排序条件不允许时抛出异常。您可以像这样静默跳过禁止的条件
use Apfelfrisch\QueryFilter\Settings; use Apfelfrisch\QueryFilter\QueryFilter; // via Settings injection $settings = new Settings; $settings->setSkipForbiddenCriterias(); new QueryFilter($settings); // directly on the QueryFilter QueryFilter::new()->skipForbiddenCriterias()
指定FilterCriteria
/users?filter[name]=John
use Apfelfrisch\QueryFilter\Criterias; // Filter with name = "John" $users = QueryFilter::new() ->allowFilters(new Criterias\ExactFilter('name')) ->applyOn($queryBuilder) ->get(); // Filter with name like "%John" $users = QueryFilter::new() ->allowFilters(new Criterias\LeftStrictPartialFilter('name')) ->applyOn($queryBuilder) ->get();
编写自定义筛选器
您的自定义筛选器必须实现Filter接口。具体实现可以在Criterias文件夹中找到。
如果您想将您的筛选器设置为默认值,可以这样做
use Apfelfrisch\QueryFilter\Settings; use Apfelfrisch\QueryFilter\QueryFilter; $settings = new Settings(); $settings->setDefaultFilterClass(MyCustomerFilterClass::class); $queryFilter = new QueryFilter($settings);
编写自定义查询解析器
待办
编写自定义QueryBuilderAdapter
待办