项目作者: slexx1234

项目描述 :
Comparisons language
高级语言: PHP
项目地址: git://github.com/slexx1234/comparisons-lang.git
创建时间: 2018-12-26T20:43:01Z
项目社区:https://github.com/slexx1234/comparisons-lang

开源协议:

下载


Comparisons language

Это мини язык для задания условий сравнения к уже имеющимся данным. К идее меня
сподвигло постоянное написание схожих между собой фильтров для GET запросов
минимальное число, максимальное, интервал даты или конкретная дата использовать я
это буду при создании фильтров для GET запросов ?example=>5&<=10.

Язык очень прост, я взял обычный синтаксис WHERE SQL и выкинул из него всё не нужное, к примеру
название колонок (она указывается только один раз), длинные слова AND был заменён на &, а
OR на |.

Типы данных

В языке присуцтвуют несколько типов данных:

Название типа Пример Регулярное выражение
DATE_TIME 2018-12-26 23:00:00 \d{4}-\d{2}-\d{2} \d\d:\d\d:\d\d
DATE 2018-12-26 \d{4}-\d{2}-\d{2}
FLOAT 0.1 -?\d\.\d+
INT 777 -?\d+

Во всём выражении может использоваться только один тип данных, он зарание должен
быть известен, наглухо зашит в код. При попытке сравнения числа и даты будет
вызвано исключение.

Операторы сравнения

Доступны следующие операторы сравнения:

Оператор Описание
= Проверяет равны ли входные данные сравниваемым
!= Проверяет не равны ли входные данные сравниваемым
> Проверяет входные данные больше сравниваемых
>= Проверяет входные данные больше или равны сравниваемым
< Проверяет входные данные являются меньше сравниваемых
<= Проверяет входные данные меньше или равны сравниваемым

Каждый оператор сравнения всегда пишется перед входными параметрами: >5, =5

Логические операторы

Для задания нескольких отдельных условий есть логические операторы.

Оператор Описание
& Левый и правый операнд должны возвращать правд
` ` Левый или правый операнд должны возвращать правду

Группировка

Группировка условий осуществляется с помощью круглых скобок () как в матемытике или
в любом языке программирования. Здесь кроется небольшой подвох, возможности группировки
сильно ограничены, группы не могут быть вложенными друг в друга (>6&(<4&>-44)) - это
вызовет исключение.

Установка

Установите пакет composer:

  1. composer require slexx/comparisons-language

Используйте в вашем php.

  1. <?php
  2. require 'vendor/autoload,php';
  3. use Slexx\CL\CL;
  4. use Slexx\CL\Tokenizer;
  5. $parser = new CL('>=18&<40', Tokenizer::T_INT);
  6. var_dump($parser->compileToPHP('$age')); // "$age >= 18 && $age < 40"
  7. var_dump($parser->compileToSQL('users', 'age')); // "`users`.`age` >= 18 AND `users`.`age` < 40"

Я думаю что это неплохая оптимизация учитывая что входная строка 8 символов, а SQL вариант аж 42!

Laravel

Для использования вместе с фремворком laravel просто добывте в ваш
файл config/app.php одну строку:

  1. 'providers' => [
  2. // ...
  3. Slexx\CL\LaravelServiceProvider::class,
  4. ];

Провайдер добавить однин очень полезный миксин CLFilter в Query Builder, он позволит использовать
Comparison Language прям при генерации запросов:

  1. Users::CLFilter('age', '>=18&<40', 'int')->get();

А вот пример как это будет выглядеть по моеё задумке с GET параметрами:

  1. $query = Users::query();
  2. if (Request::has('birthday')) {
  3. $query->CLFilter('birthday', Request::get('birthday'), 'date');
  4. }
  5. if (Request::has('created_at')) {
  6. $query->CLFilter('created_at', Request::get('created_at'), 'date_time');
  7. }
  8. if (Request::has('rating')) {
  9. $query->CLFilter('rating', Request::get('rating'), 'int');
  10. }
  11. $users = $query->get();

Вся остальныя волокита с фильтрами вроде минимальный возраст, максимальный переходит к
фронтендеру, ему остаётся лишь передать нужный оператор через API.

В миксин принимаются следующие аргументы:

Имя Тип Описание
$field `string array` Имя колонки к фильтрации, можно отделить имя таблицы точкой table.column или передать массив ['table', 'column'].
$input string Строка Comparisons Language
$type string Тип данных к сравнению int, integer, float, double, date, datetime, date_time или date-time