biera/filter

v1.1.0 2022-05-30 17:08 UTC

This package is auto-updated.

Last update: 2024-08-29 05:37:34 UTC


README

此包包含一个小型库,旨在简化每个Web应用项目的过滤问题:过滤。它不依赖于存储(检查可用的 绑定)并附带一个微语言,有助于构建“过滤表达式”。

{
    "and": [
        {
            "lte": {"releaseDate": "2000-12-31"}
        },
        {
            "in": {"genre": ["biography", "drama"]}
        }
    ]
}

它应该是相当直观的(如果不是,它读取 XX世纪所有戏剧和传记电影)。

用法

可以使用 Biera\Filter\Operator 直接构建过滤表达式,它为所有支持的运算符提供了构造方法

use Biera\Filter\Operator;

// all drama and biography movies released in XX century
$filterExpression = Operator::and(
    [
        Operator::lte('releaseDate', new DateTimeImmutable('2000-12-31')),
        Operator::in('genre', ['bigraphy', 'drama'])
    ]       
);

assert($filterExpression instanceof Operator);

对于更复杂的表达式,可以使用具有流畅API的 Biera\Filter\FilterExpressionBuilder 作为更好的选择

use Biera\Filter\Operator;
use Biera\Filter\FilterExpressionBuilder;

// all biography movies which are released before 2001-01-01 or last at least 120 minutes 
$filterExpression = FilterExpressionBuilder::create()
    ->and()
        ->eq('genre', 'biography')
        ->or()
            ->lt('releaseDate', new DateTimeImmutable('2001-01-01'))
            ->gte('duration', 120)
        ->end()
    ->end()
    ->build();

assert($filterExpression instanceof Operator);

然而,通常情况下,过滤表达式由客户端应用程序作为JSON编码字符串提供,在这种情况下使用 Biera\Filter\FilterExpressionFactory

use Biera\Filter\Operator;
use Biera\Filter\FilterExpressionFactory;

$filterExpression = FilterExpressionFactory::createFromJson($_GET['filters']);

assert($filterExpression instanceof Operator);

好吧,你有了过滤表达式。接下来是什么?

通常,这个库会与现有的 绑定 之一一起使用。为了演示目的,让我们使用 doctrine ORM 绑定来看看它是如何工作的

use Doctrine\ORM\EntityRepository;
use Biera\Filter\Operator as FilterExpression;
use Biera\Filter\Binding\Doctrine\ORM\WhereClauseFactory;

class MovieRepository extends EntityRepository
{   
    public function findAllByFilters(FilterExpression $filters): array
    {                
        $whereClause = WhereClauseFactory::createFromFilterExpression($filters);
           
        return $this->createQueryBuilder('movie')
            ->where($whereClause)
            ->getQuery()
            ->getResult();
    }
}

如你所见,它只是帮助处理where子句。连接、分组和可能的排序工作仍然必须由你完成。

安装

此库作为composer包分发,可以通过输入以下命令安装:

composer require biera/filter

然而,没有特定的绑定,它几乎毫无用处,因此考虑使用特定的绑定(它依赖于 biera/filter 包)。

绑定