- PVSM.RU - https://www.pvsm.ru -
Сегодня я написал последний тест для версии 3.0 модуля доступа к БД для PHPixie [1]. Когда я начал казалось что это займет всего несколько недель, но на самом деле все растянулось на где-то 2 месяца из-за огромного количества рефакторинга и переписывания сначала. Зато теперь мы имеем расширяемую библиотеку, которую можно использовать даже вне самого фреймворка (то есть если вас заставят писать на каком-то другом фреймворке или CMS вы сможете захватить свою любимую библиотеку с собой).
Я сделаю релиз после того как закончу модуль ORM и поправлю существующие модули для работы с новым API. Но если вам интересно вы можете заглянуть в ветку 3.0 на гитхабе [2] (следует однако предупредить что документации там пока нет, она появится вместе с ORM). А теперь давайте посмотрим на новые возможности.
Я уже писал о продвинутой поддержке запросов с логическими условиями для MongoDB здесь [3], но если вам лень кликнуть по этой ссылке, то вот краткое объяснение: 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');
Код полностью покрыт PHPUnit тестами, что дает 166 тестов и 1151 сравнение.
Я надеюсь что этот пост передаст мою радость с проделанной работы и что финальный релиз ORM модуля уже недалеко.
Автор: jigpuzzled
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/framework/50625
Ссылки в тексте:
[1] PHPixie: http://phpixie.com/
[2] ветку 3.0 на гитхабе: http://phpixie.com/blog/new-phpixie-database-module-finished/
[3] здесь: http://phpixie.com/blog/mongodb-driver-almost-here/
[4] Источник: http://habrahabr.ru/post/205710/
Нажмите здесь для печати.