gomoob/php-value-filter-dsl

强大的过滤器DSL PHP库,用于REST Web服务的查询/URL参数或其他过滤需求。

1.2.1 2017-12-20 09:37 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:42:00 UTC


README

强大的过滤器DSL PHP库,用于REST Web服务的查询/URL参数或其他过滤需求。

Total Downloads Latest Stable Version Build Status Coverage Code Climate License

带有not in的示例

假设您有一个可通过https://api.myserver.com/users访问的Web服务,并希望创建一个过滤器以查找姓名不是JackJoeWillianAverell的用户。

为此,您需要使用not in SQL请求来查询您的关系数据库。php-value-filter-dsl库允许您从URL查询参数中解析自定义过滤器表达式,并将其转换为可以用于您的SQL查询构建器的等效SQL表达式。

我们的过滤器表达式语言是Gomoob设计的自定义语言,旨在满足大量REST Web服务API过滤需求,此过滤器表达式在我们的文档中有详细描述。

要排除之前描述的4个姓名,可以使用以下GET HTTP请求来完成过滤。

https://api.myserver.com/users?first_name=!in('Jack','Joe','Willian','Averell')

用于解析过滤器表达式(即first_name URL查询参数值)的PHP源代码如下。

// Suppose we are inside a controller (for example inside a PSR-7 Middleware) and we got the value of the 'first_name'
// URL query parameter from "https://api.myserver.com/users?first_name=!in('Jack','Joe','Willian','Averell')"
$urlParameterName = 'first_name';
$urlParameterValue = "!in('Jack','Joe','Willian','Averell')";

// Parsing the filter expression
$filterConverter = new SqlFilterConverter();
$sqlFilter = $this->filterConverter->transform($urlParameterName, $urlParameterValue);

// Use the parsed result to build our SQL query
$preparedStatement = $pdo->prepare('select * from users where ' . $sqlFilter->getExpression());

// Bind our prepared statement parameters
$i = 1;
foreach($sqlFilter->getParams() as $param) {
    $preparedStatement->bindParam($i++, $param);
}

// Executes our query
$preparedStatement->execute();

前面的示例将执行以下SQL查询:select * from users where first_name not in(? ,? ,? ,?),其预处理语句参数为JackJoeWillianAverell

非常简单且有用,不是吗?

请注意,目前我们仅提供将过滤器表达式转换为SQL的功能。稍后我们将扩展库以提供将过滤器转换为其他格式的其他转换器。

文档

标准运算符

表达式语言提供了以下运算符。

非运算符

!运算符是特殊的,可以直接用于值字符串之前,或者与=in运算符组合使用。

例如,!5!=5表示“不等于5”,或者!in('Paris','London')表示“不等于Paris或London”。

AND和OR运算符

+-运算符允许创建AND和OR SQL请求。

以下是带有逻辑运算符的示例表达式。

  • property=>5.4+<12被转换为property >= ? AND property < ?,其中包含2个参数[5.4,12];
  • property=~'*ball*'-~'*tennis*'被转换为property like ? OR property like ?,其中包含2个参数`['%ball%','%tennis%']。

LIKE运算符

~运算符允许创建LIKE SQL请求,但它始终转换为等于my_property like ?的表达式,其中值等于%word%,这并不总是想要的。

要表示更复杂的LIKE表达式,可以在与=~运算符关联的值中使用*字符串运算符。

例如,property=~'*Nantes*France*'property='Nantes*France*'将被转换为property like ?,参数等于%Nantes%France%

可以使用以下值。

  • null
  • true,如果关联的属性是字符串,则转换为字符串“true”,如果属性是整数,则转换为1,如果属性是双精度浮点数,则转换为1.0
  • false,如果关联的属性是字符串,则转换为字符串“false”,如果属性是整数,则转换为0,如果属性是双精度浮点数,则转换为0.0
  • 整数
  • 浮点数
  • 字符串(必须用单引号'括起来)
  • 日期的ISO 8601格式字符串

日期和时间解析

默认情况下,当SqlFilterConverter遇到表达式中的字符串时,它将其简单地视为“标准”字符串。

但您可能有一些具有日期属性的业务实体,并希望使用日期和时间过滤器请求这些实体。为此,您可以在SqlFilterConverter上设置一个日期和时间解析器,指示它解析日期和时间字符串并将它们转换为符合使用的数据库的日期和时间字符串。

例如,配置SqlFilterConverter解析ISO 8601字符串并将它们转换为MySQL日期和时间格式如下。

$sqFilterConverter = new SqlFilterConverter();
$sqlFilterConverter->setDateTimeParser(new FormatDateTimeParser());

默认情况下,FormatDateTimeParser类使用ISO 8601日期和时间解析,但您可以使用FormatDateTimeParser->setFormat(string $format)方法更改其行为。一般来说,您会想使用PHP DateTime类提供的格式之一,也就是说,使用DateTime::ATOM、DateTime::COOKIE、DateTime::ISO8601、DateTime::RFC822、DateTime::RFC850、DateTime::RFC1036、DateTime::RFC1123、DateTime::RFC2822、DateTime::RFC3339、DateTime::RSS或DateTime::W3C之一。

解析器解析日期和时间字符串并将它们转换为PHP DateTime对象,然后内部SqlFilterConverter将DateTime对象转换为与MySQL兼容的字符串。

例如,以下转换将创建一个property <= ?表达式,其值等于兼容MySQL的2017-12-01 06:00:00。

$sqlFilter = $filterConverter->transform('property', "<='2017-12-01T06:00:00Z'");

关于Gomoob

Gomoob,我们每天使用优秀的开源框架构建高质量的软件。您想与我们开始下一个项目吗?太好了!给我们打电话或发送电子邮件,我们将尽快与您联系!

您可以通过电子邮件contact@gomoob.com或电话号码(+33)6 85 12 81 26或(+33)6 28 35 04 49联系我们。

还可以访问http://gomoob.github.io了解更多我们开发的开源软件。