Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Завершен новейший модуль базы данных для PHPixie

Anna | 31.05.2014 | нет комментариев

Сегодня я написал конечный тест для версии 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 модуля теснее неподалеку.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB