slexx / comparisons-lang

比较语言

v1.0.1 2018-12-27 17:33 UTC

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传递所需的运算符。

混合接受以下参数