cekurte / rql
PHP 的资源查询语言
Requires
- php: >=5.5
- doctrine/orm: ^2.5
- psr/http-message: ^1.0
Requires (Dev)
- cekurte/tdd: ^1.0.1
- phpunit/phpunit: ^4.8
- sensiolabs/security-checker: ^3.0
- sjparkinson/static-review: ^5.1
- squizlabs/php_codesniffer: ^2.3
- zendframework/zend-diactoros: ^1.3
This package is auto-updated.
Last update: 2024-09-16 02:41:43 UTC
README
- PHP 的资源查询语言(所有方法均通过 php unit 测试覆盖),使用这个库,你可以使用独特的输入界面进行查询,这些查询将被转换为并使用 ProcessorInterface 处理 为这个项目做出贡献!
安装
composer require cekurte/rql
如果你喜欢这个库,请给我一个 星标 =)。
文档
这个库是为了执行查询而创建的,它使用独特的界面进行转换和处理,目标数据可以是数组、数据库、文件(如 ini、xml 或 json)、web 服务等。目前,该项目仅与 Doctrine ORM 一起工作,因此,你可以对与 doctrine ORM 项目兼容的所有数据库执行查询。
我们非常欢迎他们的贡献,提交你的 pull 请求以添加新的处理器,如 Eloquent ORM、文件解析器(INI、XML、JSON)、API(Facebook、LinkedIn...)等。
表达式
好吧,现在我们展示如何使用这个库,使用等式表达式进行查询(还会展示更多表达式)。
<?php use Cekurte\Resource\Query\Language\Expr\EqExpr; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Processor\DoctrineOrmProcessor; // ... $qb = $yourDoctrineEntityRepository->createQueryBuilder('alias'); $queue = new ExprQueue(); $queue->enqueue(new EqExpr('alias.field', 'value')); // You can enqueue all expressions that implemented // the Cekurte\Resource\Query\Language\Contract\ExprInterface (new DoctrineOrmProcessor($qb))->process($queue); // And now you can use the Doctrine QueryBuilder normally $results = $qb->getQuery()->getResult(); // ...
好的,但是为什么不使用 Doctrine QueryBuilder 来构建查询并执行它呢?因为使用相同的界面在多个数据源中进行搜索的灵活性,更改 Processor 类,在这种情况下是 DoctrineOrmProcessor。
哇,你能否像我一样看到这个场景的各种可能性?那么,这个库就是为你准备的。你和我有共同的目标,并为这个项目做出贡献。
但是,如果我想构建一个表达式集合,我需要使用队列来放置表达式吗?是的,这是对这个问题的有效回答,但你也可以使用 ExprBuilder 来执行它。例如以下示例
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\Processor\DoctrineOrmProcessor; // ... $qb = $yourDoctrineEntityRepository->createQueryBuilder('alias'); $builder = new ExprBuilder(); $builder->eq('field', 'value'); (new DoctrineOrmProcessor($qb))->process($builder); // And now you can use the Doctrine QueryBuilder normally $results = $qb->getQuery()->getResult(); // ...
注意,ExprBuilder 类实现了所有可用表达式的快捷方式。
目前有以下表达式可用
- BetweenExpr
- EqExpr
- GteExpr
- GtExpr
- InExpr
- LikeExpr
- LteExpr
- LtExpr
- NeqExpr
- NotInExpr
- NotLikeExpr
- OrExpr
- PaginateExpr
- SortExpr
上面列出了可用的查询表达式,接下来你可以看到使用 ExprBuilder 和 ExprQueue 的表达式。
BetweenExpr
BetweenExpr 可用于查询一个值是否在一系列值范围内。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\BetweenExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->between('field', 1, 10); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new BetweenExpr('field', 1, 10));
EqExpr
EqExpr 可用于使用等号运算符查询值。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\EqExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->eq('field', 'value'); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new EqExpr('field', 'value'));
GteExpr
可以使用 GteExpr 来查询一个值,该值必须大于或等于 1。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\GteExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->gte('field', 1); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new GteExpr('field', 1));
GtExpr
可以使用 GtExpr 来查询一个值,该值必须大于 1。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\GtExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->gt('field', 1); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new GtExpr('field', 1));
InExpr
可以使用 InExpr 来查询一个值,该值可以是 1、2 或 3。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\InExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->in('field', [1, 2, 3]); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new InExpr('field', [1, 2, 3]));
LikeExpr
可以使用 LikeExpr 来查询一个值,该值必须等于(仅结尾)"%%value",其中 % 操作符类似于 SQL 命令中的占位符。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\LikeExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->like('field', '%value'); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new LikeExpr('field', '%value'));
LteExpr
可以使用 LteExpr 来查询一个值,该值必须小于或等于 1。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\LteExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->lte('field', 1); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new LteExpr('field', 1));
LtExpr
可以使用 LtExpr 来查询一个值,该值必须小于 1。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\LtExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->lt('field', 1); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new LtExpr('field', 1));
NeqExpr
可以使用 NeqExpr 来使用不等号查询值。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\NeqExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->neq('field', 'value'); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new NeqExpr('field', 'value'));
NotInExpr
可以使用 NotInExpr 来查询一个值,该值必须不同于 1、2 或 3。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\NotInExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->notin('field', [1, 2, 3]); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new NotInExpr('field', [1, 2, 3]));
NotLikeExpr
可以使用 NotLikeExpr 来查询一个值,该值必须不同于(仅结尾)"%%value",其中 % 操作符类似于 SQL 命令中的占位符。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\NotLikeExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->notlike('field', '%value'); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new NotLikeExpr('field', '%value'));
OrExpr
可以使用 OrExpr 来将上述比较表达式连接起来进行查询。在下面的示例中,所有填写了值 1 或 2 的字段将被返回。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\OrExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->orx(['field:eq:1', 'field:eq:2']); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new OrExpr(['field:eq:1', 'field:eq:2']));
PaginateExpr
可以使用 PaginateExpr 来分页结果,第一个参数是当前页码,第二个参数是每页结果的数量限制。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\PaginateExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->paginate(1, 10); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new PaginateExpr(1, 10));
SortExpr
可以使用 SortExpr 来排序结果,第一个参数是要排序的字段,第二个参数是方向(可以使用 asc 和 desc,类似于 SQL 命令)。
<?php use Cekurte\Resource\Query\Language\ExprBuilder; use Cekurte\Resource\Query\Language\ExprQueue; use Cekurte\Resource\Query\Language\Expr\SortExpr; // Using the ExprBuilder $expr = new ExprBuilder(); $expr->sort('field', 'asc'); // OR using the ExprQueue... $expr = new ExprQueue(); $expr->enqueue(new SortExpr('field', 'asc'));
解析器
解析器可以用来解析不同格式的输入数据到 ExprBuilder。目前有三种实现了 ParserInterface 的解析器类。
ArrayParser
ArrayParser 可以用来解析数组数据到 ExprBuilder,请参阅下面的示例。
<?php use Cekurte\Resource\Query\Language\Parser\ArrayParser; $data = [ [ 'field' => 'field', 'expression' => 'between', 'value' => '1-3', ], [ 'field' => 'field', 'expression' => 'eq', 'value' => 'value', ], [ 'field' => 'field', 'expression' => 'gte', 'value' => '1', ], [ 'field' => 'field', 'expression' => 'gt', 'value' => '1', ], [ 'field' => 'field', 'expression' => 'in', 'value' => [1, 2, 3], ], [ 'field' => 'field', 'expression' => 'like', 'value' => '%value', ], [ 'field' => 'field', 'expression' => 'lte', 'value' => '1', ], [ 'field' => 'field', 'expression' => 'lt', 'value' => '1', ], [ 'field' => 'field', 'expression' => 'neq', 'value' => 'value', ], [ 'field' => 'field', 'expression' => 'notin', 'value' => [1, 2, 3], ], [ 'field' => 'field', 'expression' => 'notlike', 'value' => '%value', ], [ 'field' => '', 'expression' => 'or', 'value' => 'field:eq:1|field:eq:2', ], [ 'field' => '', 'expression' => 'paginate', 'value' => '1-10', ] [ 'field' => 'field', 'expression' => 'sort', 'value' => 'asc', ], ]; $parser = new ArrayParser($data); /** * @var $exprBuilder Cekurte\Resource\Query\Language\ExprBuilder */ $exprBuilder = $parser->parse();
RequestParser
RequestParser 可以用来解析输入数据,该数据是 RequestInterface 的实例(兼容 PSR-7)的实例,请参阅下面的示例。
<?php use Cekurte\Resource\Query\Language\Parser\RequestParser; // Suppose that your URI of the request is: // http://www.yourdomain.com/?q[]=field:eq:1&q[]=field:eq:2 $parser = new RequestParser( $yourRequestObjectThatImplementsPSR7RequestInterface ); // If you need customize the query string parameter key that will // be used, then you can set the parameter key using the following // method (key "q" is default) // $parser->setQueryStringParameter('expr'); /** * @var $exprBuilder Cekurte\Resource\Query\Language\ExprBuilder */ $exprBuilder = $parser->parse();
StringParser
可以使用 StringParser 来解析字符串格式的输入数据,请参考下方的示例
<?php use Cekurte\Resource\Query\Language\Parser\StringParser; $data = '' . 'field:eq:1&' . 'field:eq:2&' . 'field:eq:3' ; $parser = new StringParser($data); // If you need customize the expression separator parameter key that will // be used, then you can set the parameter key using the following // method (key "&" is default) // $parser->setSeparator('SEPARATOR'); /** * @var $exprBuilder Cekurte\Resource\Query\Language\ExprBuilder */ $exprBuilder = $parser->parse();
贡献
- 给我一个星标吧 =)
- fork 它
- 创建你的功能分支(
git checkout -b my-new-feature
) - 进行修改
- 运行测试,如果需要的话,为你的代码添加新的测试(
vendor/bin/phpunit
) - 提交你的更改(
git commit -am '添加了一些功能'
) - 推送到分支(
git push origin my-new-feature
) - 创建新的 Pull Request