MZZ.Framework 0.3.x: Документация
Разделы

6.1 Генератор SQL-запросов

Для генерации SQL-запросов в mzz предназначен специальный класс simpleSelect. SimpleSelect собирает запрос из составных частей, которыми являются объекты классов criteria. Рассмотрим простейший пример:

<?php
    $criteria = new criteria('table');
    $select = new simpleSelect($criteria);
    $select->toString(); // вернёт "SELECT * FROM `table`"
?>

Как видите - генератор запросов сам позаботился о помещении имени таблицы в обратные кавычки (`). Аналогичным образом вам не нужно заботиться об одинарных кавычках ('), в которые помещаются строковые константы, и об экранировании этих строковых констант.

Рассмотрим основные приёмы работы с генератором запросов (более полный вариант - как всегда смотрите в модульных тестах).

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.