slexx / comparisons-lang
比较语言
v1.0.1
2018-12-27 17:33 UTC
Requires
Requires (Dev)
- phpunit/phpunit: ^6.2
This package is auto-updated.
Last update: 2024-09-28 06:21:42 UTC
README
这是一个用于向现有数据设置比较条件的迷你语言。这个想法是由不断地编写相似的GET请求过滤器而激发的,例如最小值、最大值、日期区间或特定日期,我将使用这个语言来创建GET请求的过滤器,如?example=>5&<=10。
该语言非常简单,我采用了普通的SQL WHERE语法,并去掉了所有不必要的部分,例如列名(仅指示一次),将长单词AND替换为&,将OR替换为|。
数据类型
该语言包含几种数据类型
整个表达式中只能使用一种数据类型,它必须事先已知,并且硬编码在代码中。如果尝试比较数字和日期,将引发异常。
比较运算符
以下是比较运算符
每个比较运算符都始终写在输入参数之前:>5、=5...
逻辑运算符
为了设置多个单独的条件,有逻辑运算符。
分组
条件分组通过圆括号()实现,类似于数学或任何编程语言。这里有一个小陷阱,分组的能力受到很大限制,组不能嵌套在彼此中(>6&(<4>-44)) - 这将引发异常。
安装
安装composer包
composer require slexx/comparisons-language
在您的php中使用。
<?php require 'vendor/autoload,php'; use Slexx\CL\CL; use Slexx\CL\Tokenizer; $parser = new CL('>=18&<40', Tokenizer::T_INT); var_dump($parser->compileToPHP('$age')); // "$age >= 18 && $age < 40" var_dump($parser->compileToSQL('users', 'age')); // "`users`.`age` >= 18 AND `users`.`age` < 40"
我认为这已经是一个不错的优化,考虑到输入字符串只有8个字符,而SQL版本有42个字符!
Laravel
要与应用程序框架laravel一起使用,只需在您的config/app.php文件中添加一行
'providers' => [ // ... Slexx\CL\LaravelServiceProvider::class, ];
提供者添加了一个非常有用的混合CLFilter到Query Builder,它允许在生成查询时直接使用比较语言
Users::CLFilter('age', '>=18&<40', 'int')->get();
以下是按照我的想法使用GET参数的示例
$query = Users::query(); if (Request::has('birthday')) { $query->CLFilter('birthday', Request::get('birthday'), 'date'); } if (Request::has('created_at')) { $query->CLFilter('created_at', Request::get('created_at'), 'date_time'); } if (Request::has('rating')) { $query->CLFilter('rating', Request::get('rating'), 'int'); } $users = $query->get();
所有其他与过滤器相关的工作,如最小年龄、最大年龄等,都转交给前端,前端只需要通过API传递所需的运算符。
混合接受以下参数