ralphschindler / basic-query-filter
此包最新版本(0.1.0)没有提供许可证信息。
基本查询过滤器
0.1.0
2017-03-28 14:36 UTC
Requires (Dev)
- phpunit/phpunit: ^6.0
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); } }