brandembassy / query-language-parser
Requires
- php: >=7.4
- beberlei/assert: ^3.3
- ferno/loco: dev-main
- nette/utils: ^3.2
- ramsey/uuid: ^4.1
Requires (Dev)
- brandembassy/coding-standard: ^9.0
- phpunit/phpunit: ^8
- roave/security-advisories: dev-master
README
感谢这个库,使用PHP解析自定义查询语言变得易如反掌。只需定义自己的字段、操作符和值,其他所有事情都会自动为你完成。那么,您是否想要这样的查询语言呢?
(brand = bmw AND color = black) OR brand IN (audi, skoda)
这个库在 ferno/loco 解析器之上运行。有关更多详细信息,请参阅 https://github.com/qntm/loco。感谢这个伟大的库!
工作原理
您将定义支持的字段和操作符,以及这两个可能的关联。然后,对于每个可能的关联,您将定义解析的输出。
感谢这个库,您可以将查询语言转换为表示数据库查询的对象集,或将转换为类似SQL的语法。输出完全取决于您。
语言部分
逻辑操作符
此库包含标准逻辑操作符。具体来说,我们谈论的是这些
-
AND
brand = bmw AND color = black
-
OR
color = black OR brand IN (audi, skoda)
-
NOT
NOT (brand = bmw AND color = black)
您也可以通过添加括号来调整操作符的优先级,如下所示
(brand = bmw AND color = black) OR (brand = audi AND color = white)
关系操作符
最常见的关联操作符已经包含在库中。您可以使用操作符 =
、!=
、~
、!~
、<
、<=
、>
、>=
、LIKE
、NOT LIKE
、IN
、NOT IN
、IS NULL
和 IS NOT NULL
,无需任何特殊努力。
自定义操作符
要丰富查询语言并添加自己的关系操作符,您必须执行以下两个步骤
-
创建定义使用此操作符的字段合同的接口。例如,请参阅
QueryLanguageFieldSupportingEqualToOperator
。通常应定义以下两点
-
操作符后应跟随的值的格式 - 您可以通过扩展某些接口来定义此内容。在操作符不带值的情况下(例如,
IS NULL
),请扩展任何特殊接口。在操作符带单个值的情况下(例如,=
),扩展QueryLanguageFieldSupportingSingleValueOperator
接口。如果操作符后应跟随多个值,请扩展QueryLanguageFieldSupportingMultipleValuesOperator
接口。 -
将接收解析字段名(以及最终解析值)的方法,并返回此特定字段和操作符组合的输出值的方法。
-
-
表示操作符的类。它必须实现接口
QueryLanguageOperator
。例如,请参阅EqualToQueryLanguageOperator
。它必须实现以下方法
getOperatorIdentifier
- 返回操作符的字符串标识符createOperatorParser
- 返回操作符的解析器isFieldSupported
- 返回给定字段是否由操作符支持。通常,您将测试给定字段是否实现了在第一步中创建的接口。createFieldExpressionParser
- 为给定字段和操作符的组合创建解析器
字段
字段是您的查询语言的核心。它定义了查询语言工作的领域。
您想要在查询语言中支持的每个字段都通过实现接口 QueryLanguageField
的类来定义。此接口定义了3个基本方法
getFieldIdentifier
- 返回字段的字符串标识符getFieldNameParserIdentifier
- 返回字段名解析器的字符串标识符createFieldNameParser
- 返回字段名解析器
每个字段还应实现它支持的关联操作符的所有接口(例如,对于支持等于操作符,请使用 QueryLanguageFieldSupportingEqualToOperator
)。
查询语言解析器
要创建查询语言解析器,请使用QueryParserFactory
。只需传递您字段列表、支持的关系运算符列表以及逻辑运算符的输出定义(为此实现LogicalOperatorOutputFactory
接口)即可,您的查询语言解析器就可以使用啦!
示例
请参阅此存储库中的examples目录,以获取基于汽车的查询语言的示例。