cekurte/rql

PHP 的资源查询语言

v0.0.5 2016-04-29 16:37 UTC

This package is auto-updated.

Last update: 2024-09-16 02:41:43 UTC


README

Build Status Code Climate Coverage Status Latest Stable Version License SensioLabsInsight

  • PHP 的资源查询语言(所有方法均通过 php unit 测试覆盖),使用这个库,你可以使用独特的输入界面进行查询,这些查询将被转换为并使用 ProcessorInterface 处理 为这个项目做出贡献

安装

  • 该软件包可在 Packagist 上获取。
  • 源代码文件与 PSR-2 兼容。
  • 自动加载与 PSR-4 兼容。
  • 输入解析数据与 PSR-7 兼容。
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 类实现了所有可用表达式的快捷方式。

目前有以下表达式可用

上面列出了可用的查询表达式,接下来你可以看到使用 ExprBuilderExprQueue 的表达式。

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();

贡献

  1. 给我一个星标吧 =)
  2. fork 它
  3. 创建你的功能分支(git checkout -b my-new-feature
  4. 进行修改
  5. 运行测试,如果需要的话,为你的代码添加新的测试(vendor/bin/phpunit
  6. 提交你的更改(git commit -am '添加了一些功能'
  7. 推送到分支(git push origin my-new-feature
  8. 创建新的 Pull Request