Штука чертовски удобная, очень полезная на сайтах с кучей всяких SQL запросов, т.к. большинство запросов - однотипные и когда делаешь копи-пасте с одного места в другое, а потом добавляешь различные условия, например,
if ( ! is_logged() ) $query .= ' AND `private` = 0';, потом приходится делать проверки, а было ли что-то в условии WHERE и т.д. Можно конечно выработать стратегию, которая чуть упростит эти проверки, но всё равно налицо тотальное дублирование кода, чего очень следует избегать. Вот тут и родилась идея написать свою небольшую реализацию ORM.
Но тут возникает сложность, на простых запросах всё работает шоколадно, но когда в дело идут join'ы логика усложняется и приходится извращаться.
Вот пример как это работает:
// Объект запроса $query = new Query(); // Инициализируем таблицы, которые будут использованы в запросе $P = new Table( 'products', 'P' ); // P будет алиасом таблицы products FROM `products` AS P $PP = new Table( 'products_pictures', 'PP' ); // Указываем поля, которые будут извлечены в ходе запроса $P->select(); // Будут извлечены все поля SELECT P.* $PP->select( 'pictures_name' ); // Добавляем в запрос таблицы $query->join( $P ); // FROM `products` AS P // Таблица добавляется методом LEFT JOIN, возвращается объект типа Критерий // для задания критерия LEFT JOIN'а в секции ON ( ... ) $PP_criteria = $query->leftJoin( $PP ); // LEFT JOIN `products_pictures` ON ... // Позже планируется добавить конструкцию USING ( ... ) $PP_criteria->andCondition( $P->field( 'pictures_id' ), $PP->field( 'pictures_id' ), '=' ); // ON ( P.`pictures_id` = PP.`pictures_id` ) // Добавляем условие в блок WHERE P.`categories_id` = 123 $query->andCondition( $P->field( 'categories_id' ), 123 ); // по-дефолту знак =
Получается такой запрос:
SELECT P.*, PP.pictures_name FROM products P LEFT JOIN products_pictures ON ( P.pictures_id = PP.pictures_id ) WHERE P.categories_id = 123
Если надо добавить сложные условия, то инициализируем объект типа Condition и добавляем в него простые условия (заменим этим кодом последнее условие)
$conditions = new Condition(); $conditions->andCondition( $P->field( 'categories_id' ), 123 ); $conditions->orCondition( $P->field( 'categories_id' ), 456 ); // в итоге получится условие ( P.categories_id = 123 OR P.categories_id = 456 ) // После чего добавим его к условиям в наш селект $query->andConditions( $conditions );
Получается такой запрос:
SELECT P.*, PP.pictures_name FROM products P LEFT JOIN products_pictures ON ( P.pictures_id = PP.pictures_id ) WHERE ( P.categories_id = 123 OR P.categories_id = 456 )
Таким же образом добавляются в конец запроса группировки, ORDER BY, лимиты
С первого взгляда кажется громоздко, но довольно удобная штука... Реализаций море, но мне так показалось более удобно... На данный момент используются 3 класса Query, Condition и Table
Вот ещё одна интересная реализация на PHP5 http://www.mzz.ru/do...html#db.queries