{"id":28913978,"url":"https://github.com/slexx1234/comparisons-lang","last_synced_at":"2026-04-21T16:35:56.209Z","repository":{"id":57053218,"uuid":"163216202","full_name":"slexx1234/comparisons-lang","owner":"slexx1234","description":"Comparisons language","archived":false,"fork":false,"pushed_at":"2018-12-27T17:34:42.000Z","size":19,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-07-29T18:00:14.302Z","etag":null,"topics":["comparisons","eloquent-filters","filters","lang","laravel"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slexx1234.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-12-26T20:43:01.000Z","updated_at":"2019-07-03T21:13:12.000Z","dependencies_parsed_at":"2022-08-24T05:21:26.515Z","dependency_job_id":null,"html_url":"https://github.com/slexx1234/comparisons-lang","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/slexx1234/comparisons-lang","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slexx1234%2Fcomparisons-lang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slexx1234%2Fcomparisons-lang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slexx1234%2Fcomparisons-lang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slexx1234%2Fcomparisons-lang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slexx1234","download_url":"https://codeload.github.com/slexx1234/comparisons-lang/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slexx1234%2Fcomparisons-lang/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32100472,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["comparisons","eloquent-filters","filters","lang","laravel"],"created_at":"2025-06-21T21:11:18.280Z","updated_at":"2026-04-21T16:35:56.202Z","avatar_url":"https://github.com/slexx1234.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Comparisons language\n\nЭто мини язык для задания условий сравнения к уже имеющимся данным. К идее меня\nсподвигло постоянное написание схожих между собой фильтров для `GET` запросов\nминимальное число, максимальное, интервал даты или конкретная дата использовать я\nэто буду при создании фильтров для `GET` запросов `?example=\u003e5\u0026\u003c=10`.\n\nЯзык очень прост, я взял обычный синтаксис `WHERE SQL` и выкинул из него всё не нужное, к примеру\nназвание колонок (она указывается только один раз), длинные слова `AND` был заменён на `\u0026`, а\n`OR` на `|`.\n\n## Типы данных\n\nВ языке присуцтвуют несколько типов данных:\n\n| Название типа | Пример              | Регулярное выражение               |\n|---------------|---------------------|------------------------------------|\n| **DATE_TIME** | 2018-12-26 23:00:00 | `\\d{4}-\\d{2}-\\d{2} \\d\\d:\\d\\d:\\d\\d` |\n| **DATE**      | 2018-12-26          | `\\d{4}-\\d{2}-\\d{2}`                |\n| **FLOAT**     | 0.1                 | `-?\\d\\.\\d+`                        |\n| **INT**       | 777                 | `-?\\d+`                            |\n\nВо всём выражении может использоваться только один тип данных, он зарание должен\nбыть известен, наглухо зашит в код. При попытке сравнения числа и даты будет\nвызвано исключение.\n\n## Операторы сравнения\n\nДоступны следующие операторы сравнения:\n\n| Оператор | Описание                                               |\n|----------|--------------------------------------------------------|\n| `=`      | Проверяет равны ли входные данные сравниваемым         |\n| `!=`     | Проверяет не равны ли входные данные сравниваемым      |\n| `\u003e`      | Проверяет входные данные больше сравниваемых           |\n| `\u003e=`     | Проверяет входные данные больше или равны сравниваемым |\n| `\u003c`      | Проверяет входные данные являются меньше сравниваемых  |\n| `\u003c=`     | Проверяет входные данные меньше или равны сравниваемым |\n\nКаждый оператор сравнения всегда пишется перед входными параметрами: `\u003e5`, `=5`...\n\n## Логические операторы\n\nДля задания нескольких отдельных условий есть логические операторы.\n\n| Оператор | Описание                                          |\n|----------|---------------------------------------------------|\n| `\u0026`      | Левый и правый операнд должны возвращать правд    |\n| `|`      | Левый или правый операнд должны возвращать правду |\n\n## Группировка\n\nГруппировка условий осуществляется с помощью круглых скобок `()` как в матемытике или\nв любом языке программирования. Здесь кроется небольшой подвох, возможности группировки\nсильно ограничены, группы не могут быть вложенными друг в друга `(\u003e6\u0026(\u003c4\u0026\u003e-44))` - это\nвызовет исключение.\n\n## Установка\n\nУстановите пакет [composer](http://composer.org/):\n```bash\ncomposer require slexx/comparisons-language\n```\n\nИспользуйте в вашем `php`.\n```php\n\u003c?php\n\nrequire 'vendor/autoload,php';\n\nuse Slexx\\CL\\CL;\nuse Slexx\\CL\\Tokenizer;\n\n$parser = new CL('\u003e=18\u0026\u003c40', Tokenizer::T_INT);\n\nvar_dump($parser-\u003ecompileToPHP('$age')); // \"$age \u003e= 18 \u0026\u0026 $age \u003c 40\"\nvar_dump($parser-\u003ecompileToSQL('users', 'age')); // \"`users`.`age` \u003e= 18 AND `users`.`age` \u003c 40\"\n```\n\nЯ думаю что это неплохая оптимизация учитывая что входная строка 8 символов, а `SQL` вариант аж 42!\n\n## Laravel\n\nДля использования вместе с фремворком [laravel](https://laravel.com/) просто добывте в ваш\nфайл `config/app.php` одну строку:\n\n```php\n'providers' =\u003e [\n    // ...\n    Slexx\\CL\\LaravelServiceProvider::class,\n];\n```\n\nПровайдер добавить однин очень полезный миксин `CLFilter` в Query Builder, он позволит использовать\n*Comparison Language* прям при генерации запросов:\n\n```php\nUsers::CLFilter('age', '\u003e=18\u0026\u003c40', 'int')-\u003eget();\n```\n\nА вот пример как это будет выглядеть по моеё задумке с `GET` параметрами:\n\n```php\n$query = Users::query();\n\nif (Request::has('birthday')) {\n    $query-\u003eCLFilter('birthday', Request::get('birthday'), 'date');\n}\n\nif (Request::has('created_at')) {\n    $query-\u003eCLFilter('created_at', Request::get('created_at'), 'date_time');\n}\n\nif (Request::has('rating')) {\n    $query-\u003eCLFilter('rating', Request::get('rating'), 'int');\n}\n\n$users = $query-\u003eget();\n```\n\nВся остальныя волокита с фильтрами вроде минимальный возраст, максимальный переходит к\nфронтендеру, ему остаётся лишь передать нужный оператор через `API`.\n\nВ миксин принимаются следующие аргументы:\n\n| Имя      | Тип            | Описание                                                                                                              |\n|----------|----------------|-----------------------------------------------------------------------------------------------------------------------|\n| `$field` | `string|array` | Имя колонки к фильтрации, можно отделить имя таблицы точкой `table.column` или передать массив `['table', 'column']`. |\n| `$input` | `string`       | Строка Comparisons Language                                                                                           |\n| `$type`  | `string`       | Тип данных к сравнению `int`, `integer`, `float`, `double`, `date`, `datetime`, `date_time` или `date-time`           |","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslexx1234%2Fcomparisons-lang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslexx1234%2Fcomparisons-lang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslexx1234%2Fcomparisons-lang/lists"}