byteferry / rql-parser
一个用于解析资源查询语言(RQL)到PHP数据结构的PHP解析器
0.1.2
2021-05-15 15:58 UTC
Requires
- php: >=7.1.0
Requires (Dev)
- orchestra/testbench: ^5.5
- phpunit/phpunit: ^4.8|^5.2|^7.0|^8.0
This package is auto-updated.
Last update: 2024-09-15 22:58:51 UTC
README
ByteFerry RQL-Parser用于将RQL文本解析为具有PHP数组结构的参数,以便调用PHP方法。
该库由以下部分组成
- RQL代码的令牌化解析器
- 创建抽象语法树的解析器
- 使用简化ABNF的RQL构建器
特性
- 高性能。源代码大小小于60KB。
- 完全符合编译规范。
- 对RQL语法的检查友好,便于开发。
- 支持读取和写入查询。
- 支持
filter
、sort
、search
和pagination
。 - 使用phpUnit进行全面测试。
- 无依赖。
为什么选择RQL
- 对于相同的数据,RQL的字节数比JSON少得多。
- 简单易学。
- RQL将使API接口更加灵活。
- RQL比GraphQL更适合小型和中型项目。
- RQL可以为您节省更多开发时间。
安装
$ composer requrire byteferry/rql-Parser
用法
- 解析完整查询
use ByteFerry/RqlParser/Parser; $rql_string = 'any(User,columns(id,name,age,gender,address),filter(eq(age,19)))'; try{ $query = Parser::parse( $rql_string); }catch(\Exception $e){ // will catch errror of parse or grammer checking. }
如果成功,将返回一个QueryInterface。
- 解析RQL查询的一部分
use ByteFerry/RqlParser/Parser; $rql_string = 'filter(eq(age,19))'; try{ $query = Parser::parse( $rql_string, true); }catch(\Exception $e){ // will catch errror of parse or grammer checking. }
以下是一个复杂示例。(不是一个真实查询,但返回所有属性)
$rql_str= 'all(User,aggr(id,name,age,gender,address,avg(age)),filter(is(created_at, null()), search(Jhon),sort(-id,+age),having(gt(sum(amount),0)),limit(0,20)))'; //, //, $result = Parser::parse($rql_str); // Returns: /** array ( 0 => ByteFerry\RqlParser\Query::__set_state(array( 'container' => array ( 'resource' => 'User', 'columns' => array ( 0 => 'id', 1 => 'name', 2 => 'age', 3 => 'gender', 4 => 'address', 5 => 'avg(age)', ), 'columns_operator' => 'aggr', 'group_by' => array ( 0 => 'id', 1 => 'name', 2 => 'age', 3 => 'gender', 4 => 'address', ), 'filter' => array ( 0 => ' created_at is null ', ), 'paramaters' => array ( 'created_at' => NULL, 'sum(amount)' => '0', ), 'search' => 'Jhon%', 'sort' => array ( 0 => array ( 0 => 'id', 1 => 'DESC', ), 1 => array ( 0 => 'age', 1 => 'ASC', ), ), 'having' => array ( 0 => ' sum(amount) > 0 ', ), 'limit' => array ( 0 => '0', 1 => '20', ), 'operator' => 'all', 'query_type' => 'Q_READ', ), )), ) */
我们可以看到解析器自动添加了groupby,并返回属性参数以进行验证。
文档
贡献
- 仓库分支
- 创建Feat_xxx分支
- 提交您的代码
- 创建拉取请求
捐赠
如果您觉得这个项目很有用,您可以给作者买一杯果汁 🍹
许可
MIT
版权 [2020] ByteFerry byteferry@qq.com