visionp/genesis

There is no license information available for the latest version (dev-master) of this package.

Test task

dev-master 2018-12-09 07:42 UTC

README

composer require visionp/genesis

##Описание Базовые классы и интерфейсы: ###BaseTable Содержит связи (relation) с другими таблицами в формате [Table::class, 'localKey', 'ForeignKey'], имя коннекта с БД. ###Connection Предоставляет общий интерфейс для общения с БД, на вход получает sql и массив с параметрами для него, который драйвер должен будет сбиндить ###Driver Мост для Connection и конечно реализацией общения с БД (коннекшн фреймворка, собственная реализация и тд) ###Relation Класс который разруливает связи с другими таблицами на основании настроек указанных в текущей таблице, мы можем добавить новую таблицу и добавить ей, например, связи с другими таблицами ###Builder Механизм формирующий sql с условиями (при наличии relations на их основании рекурсивно будут созданы условия со связанными таблицами), учитывая что по условию задачи таблицы находятся на разных серверах,то запросы проходят независимо, что накладывает дополнительные ограничения (оператор in и проблемы с памятью) ###Condition Работает с условиями выборки, здесь же можем добавлять новые операторы и описывать их логику ###SearchComponent Написал для объединения всей логики и демонстрации

В пакете есть две таблицы Send и User, запрос можно сформировать в виде строки 'user email:like:qwqe send.type_id:>=:0 send:>:12'. Поиск будет происходить в таблице первого аргумента, он же это имя класса в нижнем регистре. Аргумент "send.type_id:>=:0" говорит о том что в выборку должны попасть записи у которых у relation с именем "send" type_id > 0, когда в качестве аргумента указано имя relation, то библиотека это воспринимает как ограничение по количеству, групировка произойдет по внешнему ключу с relation. Аргументы "email:like:qwqe" говорят о том что поиск будет происходить в основной таблице.

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

Cимвол ':' добавлен для того чтобы можно было использовать конструкции вида 'send.type:in:1,2,3' или 'email:like:dfdf'.

Работу с консолью не делал, но в случае необхоимости можно данный пакет протестить в моем фреймворке "composer create-project visionp/simple-framework", в нем есть консоль.

Также быстро можно протетстить в Laravel, для примера я написал два драйвера для работы с ним (используется подключение по умолчанию), к примеру:

        $driver = new LaravelDriver();
        $testDriver = new TestDriver();
        Connection::add('default', $driver);
        Connection::add('test', $testDriver);
        $str = 'user send.type_id:>=:0  send:>:12';
        $c = new SearchComponent($str);

        dd($c->get());