slexx / comparisons-lang
Comparisons language
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 2
Watchers: 1
Forks: 0
Open Issues: 0
Type:package
Requires
Requires (Dev)
- phpunit/phpunit: ^6.2
This package is auto-updated.
Last update: 2024-10-28 06:32:16 UTC
README
Это мини язык для задания условий сравнения к уже имеющимся данным. К идее меня
сподвигло постоянное написание схожих между собой фильтров для GET
запросов
минимальное число, максимальное, интервал даты или конкретная дата использовать я
это буду при создании фильтров для GET
запросов ?example=>5&<=10
.
Язык очень прост, я взял обычный синтаксис WHERE SQL
и выкинул из него всё не нужное, к примеру
название колонок (она указывается только один раз), длинные слова 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, он позволит использовать
Comparison Language прям при генерации запросов:
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
.
В миксин принимаются следующие аргументы: