apfelfrisch/query-filter

一个无框架查询过滤器,使用URL参数对查询进行排序和筛选

0.3.1 2024-03-12 15:07 UTC

This package is auto-updated.

Last update: 2024-09-12 16:13:42 UTC


README

Unit tests Static Analysis Mutation tests

此包提供了一个无框架查询过滤器,允许您根据提供的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

待办