Для генерации SQL-запросов в mzz предназначен специальный класс simpleSelect. SimpleSelect собирает запрос из составных частей, которыми являются объекты классов criteria. Рассмотрим простейший пример:
<?php $criteria = new criteria('table'); $select = new simpleSelect($criteria); $select->toString(); // вернёт "SELECT * FROM `table`" ?>
Как видите - генератор запросов сам позаботился о помещении имени таблицы в обратные кавычки (`). Аналогичным образом вам не нужно заботиться об одинарных кавычках ('), в которые помещаются строковые константы, и об экранировании этих строковых констант.
Рассмотрим основные приёмы работы с генератором запросов (более полный вариант - как всегда смотрите в модульных тестах).
-
Выборка определённых полей
<?php $criteria = new criteria('table'); $criteria->addSelectField('field1'); $criteria->addSelectField('field2', 'alias'); $select = new simpleSelect($criteria); $select->toString(); // вернёт "SELECT `field1`, `field2` AS `alias` FROM `table`" ?>
Каждый из методов критерия возвращает ссылку на самого себя, таким образом методы можно выстраивать в цепочку подобным образом:
<?php $criteria = new criteria('table'); $criteria->addSelectField('field1')->addSelectField('field2', 'alias')->addSelectField('field3'); $select = new simpleSelect($criteria); $select->toString(); // "SELECT `field1`, `field2` AS `alias`, `field3` FROM `table`" ?>
-
Выборка по условию
Третьим аргументом у метода criteria::add() является способ сравнения. К ним относятся: EQUAL('='), NOT_EQUAL('<>'), GREATER('>'), LESS('<') и другие. Список констант можно посмотреть непосредственно в классе criteria либо в API-документации (!!).
<?php $criteria = new criteria('table'); $criteria->add('field', 'value', criteria::GREATER)->add('field2', 'value2'); $select = new simpleSelect($criteria); $select->toString(); // "SELECT * FROM `table` WHERE `table`.`field` > 'value' AND `table`.`field2` = 'value2'" ?>
-
Сортировка и ограничение числа записей
<?php $criteria = new criteria('table'); $criteria->setLimit(10)->setOffset(15)->setOrderByFieldDesc('field'); $select = new simpleSelect($criteria); $select->toString(); // "SELECT * FROM `table` ORDER BY `table`.`field` DESC LIMIT 15, 10" ?>
-
Объединения с другими таблицами
<?php $criteria = new criteria('table'); $criteria->addJoin('foo', new criterion('alias.id', 'table.id', criteria::EQUAL, true), 'alias', criteria::JOIN_INNER); $select = new simpleSelect($criteria); $select->toString(); // "SELECT * FROM `table` INNER JOIN `foo` `alias` ON `alias`.`id` = `table`.`id`" ?>
Описание класса criterion смотрите ниже
Из примера видно - что в качестве условия объединения в метод criteria::addJoin() вторым аргументом передаётся объект класса criterion. Тип объединения задаётся четвёртым аргументом и может быть criteria::JOIN_INNER либо criteria::JOIN_LEFT (значение по умолчанию). -
Добавление группировки
<?php $criteria = new criteria('table'); $criteria->addGroupBy('table.field'); $select = new simpleSelect($criteria); $select->toString(); // "SELECT * FROM `table` GROUP BY `table`.`field`" ?>
Criterion
Класс criterion является атомарной составляющей в генераторе запросов. Именно он хранит информацию об операндах и условиях их сравнения. Обычной практикой является передача ему первым аргументом - имени поля, вторым - строковой константы, имени другого поля, массива с данными (для случаев с IN и BETWEEN). Третьим аргументом является тип сравнения операндов. Четвёртым - флаг, обозначающий что второй операнд является полем (вследствие чего его нужно заключать в `, а не в ' и не экранировать). Примеры использования класса:
<?php $criterion = new criterion('field', array('value1', 'value2'), criteria::IN); $criterion->generate(); // "`field` IN ('value1', 'value2')" $criterion = new criterion('field', 'value', criteria::NOT_EQUAL); $criterion->generate(); // "`field` <> 'value'" $criterion = new criterion('field', '%q_', criteria::LIKE); $criterion->generate(); // "`field` LIKE '%q_'" $criterion = new criterion('field', '', criteria::IS_NULL ); $criterion->generate(); // "`field` IS NULL" $criterion = new criterion('field', array(1, 10), criteria::BETWEEN); $criterion->generate(); // "`field` BETWEEN '1' AND '10'" $criterion = new criterion('field', 'field2', criteria::EQUAL, true); $criterion->generate(); // "`field` = `field2`" ?>
Также объекты criterion можно объединять друг с другом посредством методов criterion::addAnd() и criterion::addOr(), обозначающих соответственно связь посредством логических and и or.
<?php $criterion = new criterion('field', 'value'); $criterion->addAnd(new criterion('field2', 'value2')); $criterion->generate(); // "(`field` = 'value') AND (`field2` = 'value2') $criterion = new criterion(); $cr1 = new criterion('field1', 'value1'); $cr2 = new criterion('field2', 'value2'); $cr3 = new criterion('field2', 'value3'); $cr4 = new criterion('field4', 'value4', criteria::GREATER_EQUAL); $cr5 = new criterion('field5', 'value5', criteria::LESS_EQUAL); $cr2->addOr($cr3); $cr2->generate(); // "(`field2` = 'value2') OR (`field2` = 'value3')" $cr1->addAnd($cr2); $cr1->generate(); // "(`field1` = 'value1') AND ((`field2` = 'value2') OR (`field2` = 'value3'))" $cr4->addAnd($cr5); $cr4->generate(); // "(`field4` >= 'value4') AND (`field5` <= 'value5')" $criterion->add($cr1); $criterion->generate(); // "((`field1` = 'value1') AND ((`field2` = 'value2') OR (`field2` = 'value3')))" $criterion->addOr($cr4); $criterion->generate(); // "((`field1` = 'value1') AND ((`field2` = 'value2') OR (`field2` = 'value3'))) OR ((`field4` >= 'value4') AND (`field5` <= 'value5'))" ?>
Метод criteria::generate() здесь вызывается в демонстрационных целей - вам не придётся его вызывать вручную, эту работу выполняет сам simpleSelect.