Закончен новый модуль базы данных для PHPixie

от автора

image
Сегодня я написал последний тест для версии 3.0 модуля доступа к БД для PHPixie. Когда я начал казалось что это займет всего несколько недель, но на самом деле все растянулось на где-то 2 месяца из-за огромного количества рефакторинга и переписывания сначала. Зато теперь мы имеем расширяемую библиотеку, которую можно использовать даже вне самого фреймворка (то есть если вас заставят писать на каком-то другом фреймворке или CMS вы сможете захватить свою любимую библиотеку с собой).

Я сделаю релиз после того как закончу модуль ORM и поправлю существующие модули для работы с новым API. Но если вам интересно вы можете заглянуть в ветку 3.0 на гитхабе (следует однако предупредить что документации там пока нет, она появится вместе с ORM). А теперь давайте посмотрим на новые возможности.

С точки зрения среднестатистического пользователя

Я уже писал о продвинутой поддержке запросов с логическими условиями для MongoDB здесь, но если вам лень кликнуть по этой ссылке, то вот краткое объяснение: MongoDB не использует индексы при использовании запросов типа “(A or B) OR ( C and (D or E))”, так что PHPixie сама приведет запросы в такие формы которые будут их использовать.

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

$query     ->where('name', 'Trixie')     ->or_where('name', 'Tinkerbell')     ->where_not('id', '>', 7)     ->having('count','<', 5)     ->or_having('count', 7);   //Или попроще: $query     ->where('name', 'Trixie')     ->_or('name', 'Tinkerbell')     ->_and_not('id', '>', 7)     ->having('count', '<', 5)     ->_or('count', 7); //Заметьте как метод _or запоминает контекст в котором используется //(то есть работает как для  'where' так и для 'having') 

Несколько подходов к вложенной логике:

$query     ->where('name','Trixie')     ->or(function($builder){         $builder             ->_and('id',7)             ->_or('id',5)     }); //WHERE name = 'Trixie' OR ( id = 7 OR id = 5 )   //Или если вам не нравятся коллбеки  //(также удобно при динамическом формировании запроса, например с EXT JS гридом) $query->where('name','Trixie'); $query     ->start_where_group('or')         ->_and('id',7)         ->_or('id',5)     ->end_where_group(); 

Специальные операторы для сравнения колонок:

$query->where('fairies.id','*=','pixies.id'); 

Возможность использования вставок SQL кода с отдельными параметрами:

$expr = $this->db->expr('concat(name, ?)', array('test')); $query->where($expr, 'Trixietest'); //WHERE concat(name, ?) = 'Trixietest'; 

Поиск строк по NULL значению, не зная наперед что это NULL:

$category_id = null; $query->where('category_id', $category_id); //даст WHERE category_id IS NULL //а не WHERE category_id = NULL 

Сложные условия для JOIN….ON используя уже знакомый синтакс:

$query->join('pixies');   //По умолчанию сравниваться будут колонки $query->on('fairies.id','pixies.id');   //Можем добавить  условий и посложнее $query->on('fairies.count','*>','pixies.count'); 
C точки зрения продвинутого разработчика
  • Невероятно легкий, всего 57 килобайт кода
  • Строители запросов (query builders) не содержат никакой логики относящийся к их парсингу (например в SQL код). Вместо этого каждый драйвер использует свой Parser сервис, делая сами объекты запросов легкими и дешевыми с точки зрения памяти. Использование парсеров как сервисы делает дебаг и расширение их тривиальными задачами. К слову каждый парсер создастся в памяти только раз для всех запросов.
  • Каждый парсер разделен на парсеры отдельных условий и групп условий (Condition Group Parser). Такое разделение позволяет легко добавить свои кастомные операторы.
  • Связывание зависимостей вынесено в отдельные классы драйверов, то есть ни в одном случае (кроме как выбрасывания исключений) ни один класс не создает объекты сам используя команду new. Это позволяет легко заменить любой класс на свою имплементацию.
  • Запросы к MongoDB парсаються в специальные Runner объекты, которые легко поддаются дебагу на случай ошибки.
  • SQL базы данных которые работают через PDO имеют свои отдельные адаптеры и парсеры что позволяет легко добавить поддержку любой базы данных с которой работает PDO используя минимум кода.

Код полностью покрыт PHPUnit тестами, что дает 166 тестов и 1151 сравнение.

Я надеюсь что этот пост передаст мою радость с проделанной работы и что финальный релиз ORM модуля уже недалеко.

ссылка на оригинал статьи http://habrahabr.ru/post/205710/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *