ralphschindler/basic-query-filter

此包最新版本(0.1.0)没有提供许可证信息。

基本查询过滤器

0.1.0 2017-03-28 14:36 UTC

This package is auto-updated.

Last update: 2024-08-29 04:37:06 UTC


README

这最初是一个周末项目。这是一个用于过滤查询语言的DSL解析器,主要用于API或类似环境中,其中过滤基于谓词逻辑。

目标是能够将字符串过滤器解析为谓词表达式对象,以便将其附加到后端实现。此后端实现可以是Doctrine、Laravel Eloquent或文档存储。

此语言中的示例查询

  • price > 100
  • price > 100 AND active = 1
  • product.price > 100 AND category.id = 7
  • name =~ "Foo%"
  • created_at > "2017-01-01" and created_at < "2017-01-31"
  • status = 1 AND (name = "PHP Rocks" || name = "I ♥ API's")

安装

composer require "ralphschindler/basic-query-filter"

用法

基本用法是取一个字符串并对其进行解析,使用ParseTree将表达式转换为附加库所需的内容。

$parseTree = (new QueryFilter\Parser)->parse($filter);
foreach ($parseTree->getPredicates() as $predicateInfo) {
    list($combinedBy, $predicate) = $predicateInfo;
    // ...    
}

Laravel

根据需要扩展用法以适应更多的过滤功能。

// $modelQuery is a Model::newQuery() instance (Illuminate\Database\Eloquent\Builder)

foreach ($parseTree->getPredicates() as $predicateInfo) {
    list($combinedBy, $predicate) = $predicateInfo;
    $op = ($predicate->op == '=~') ? 'like' : $predicate->op;
    if ($combinedBy === 'OR') {
        $modelQuery->orWhere((string)$predicate->left, $op, $predicate->right);
    } else {
        $modelQuery->where((string)$predicate->left, $op, $predicate->right);
    }
}