Документация

Начало работы

Модели (models)

Шаблоны (views) и маршрутизация (routes)

Формы

SQL запросы

Сессии и безопасность

Плагины

Конструктор запросов

Для быстрого извлечения данных моделей в MV используются специальные методы, которые обращаются к конструктору SQL запросов.

Примеры использования конструктора запросов.

$rows = $this -> select(array("order->desc" => "date", "limit->" => 21,7));

$rows = $this -> select(array("parent" => 7, "active" => 1, "in_menu" => 1, "order->asc" => "order"));

$block_content = $mv -> blocks -> findRecord(array("id" => 1, "active" => 1));

$last_article = $mv -> articles -> selectOne(array("order->desc" => "active" => 1));

$total_active = $mv -> events -> countRecords(array("active" => 1));

$client = $mv -> clients -> findRecordById(487);

Методы модели, использующие конструктор запросов, в качестве параметра все используют массив с параметрами для SQL запроса и обращаются к таблице модели. Если параметры не были переданы (либо передан пустой массив), то будут извлечены (посчитаны) все записи в таблице модели.

  • select() - возвращает ассоциированный массив записей (рядов, массивов) из базы данных, удовлетворяющих условиям поиска
  • selectOne() - возвращает ассоциированный массив, с полями одной записи
  • selectColumn() - возвращает обыкновенный массив со значениями нужной колонки, параметр "fields->" обязателен
  • countRecords() - возвращает целое число, которое является количеством полей удовлетворяющих заданным условиям
  • findRecord() - тоже что и selectOne(), но если искомая запись была найдена то ее id помещается в свойство "id" текущей модели и возвращается объект класса Record для удобной работы с данными. Если запись не найдена, то вернется false.
  • findRecordById($id) - тоже что и findRecord(), только с единственным параметром id нужной записи. Единственным аргументом является целое число - id искомой записи. Возвращается объект класса Record, либо false если запись не найдена.

Примеры использования

//Поиск страницы по URL
$content = $mv -> pages -> findRecord(array("url" => "contact", "active" => 1));

<h1><? echo $content -> name; ?></h1>
<div><? echo $content -> content; ?></div>

//Построение списка меню 
public function displayMenu($parent)
{
    $rows = $this -> select(array("parent" => $parent, "active" => 1, "in_menu" => 1, "order->asc" => "order"));

    foreach($rows as $row)
    {
        ...
    }
}

//Построение ленты событий (новостей)
public function display()
{
    $rows = $this -> select(array("order->desc" => "date", "limit->" => $this ->  pager -> getParamsForSQL()));

    foreach($rows as $row)
    {
        ...
    }
}

Параметры для конструктора SQL запросов

"field" => "value" - параметры вида "ключ-значение" (проверка на равенство)

//Все записи в родительском разделе id=32
$rows = $this -> select(array("parent" => 32));

//Все новости из раздела "Спорт", которые одобрены для публикации
$rows = $mv -> news -> select(array("type" => "sport", "active" => 1));

//Корпоративные клиенты с подтвержденной регистрацией за конкретную дату
$rows = $mv -> clients -> select(array("group" => "copropate", "confirm" => 1, "date" => "2012-07-24"));

"field(!=, >, <, >=, <=)" => "value" - параметры вида "ключ-значение" (проверка на неравенство и другие условия)

//Все записи кроме типа с id=7
$rows = $this -> select(array("type!=" => 7));

//Товары с ценой больше 450
$rows = $this -> select(array("price>" => 450));

//Книги объемом более 300 страниц, поступившие за
//определенный временной интервал
$rows = $mv -> books -> select(array("pages>=" => 300, "date>=" => "2011-02-21", "date<=" => "2012-11-07"));

"fields->" => "`aaa`,`bbb`,`ccc`" - ограничение полей для выборки (по умолчанию берутся все поля таблицы)

//Взять названия и содержания всех активных блоков
$rows = $mv -> blocks -> select(array("active" => 1, "fields->" => "`name`,`content`"));

"field->in" => "1,2,3" - перечисление возможных значений параметра

//Выбрать товары с id равными 3, 64, и 9, которые отображаются в меню
$rows = $mv -> products -> select(array("id->in" => "3,64,9", "in_menu" => 1));

//Выбрать новости из разделов 1,3,4,7 и 12
$rows = $mv -> news -> select(array("theme->in" => "1,3,4,7,12"));

"field->not-in" => "1,2,3" - перечисление значений, которым не должен удовлетворять параметр

//Выбрать всех клиентов, кроме перечисленных
$rows = $mv -> clients -> select(array("id->not-in" => "3,77,91"));

"field->like" => "abc" - сравнение со строковым значением

//Все клиенты, у которых в фамилии присутствует "иван" 
$rows = $mv -> clients -> select(array("last_name->like" => "иван"));

"field->not-like" => "abc" - сравнение с отсутствием строкового значения

//Все страницы, у которых в заголовках отсутствует "магазин" 
$rows = $mv -> pages -> select(array("title->not-like" => "магазин"));

"order->asc" => "field", "order->desc" => "field" - сортировка результатов выборки (подробнее в разделе Сортировка)

//Статьи по дате публикации, вначале самые поздние
$rows = $mv -> articles -> select(array("order->desc" => "date"));

//Товары раздела по цене, вначале дешевые
$rows = $mv -> products -> select(array("catalog" => "49", "order->asc" => "price"));

"order->double" => "field->direction" - дополнительная (двойная) сортировка результатов выборки, применяется совместно с "order->asc" => "field" или "order->desc" => "field"

//Статьи по дате публикации и дополнительно по рейтингу, в начале самые популярные
$rows = $mv -> articles -> select(array("order->desc" => "date", "order->double" => "rating->desc"));

"order->in" => "23,5,76,9" - сортировка результатов выборки в порядке следования значений параметра id. Применяется только для СУБД MySQL, при этом запускается конструкция "ORDER BY FIELD (`id`, 23,5,76,9)"

//Товары в порядке следования переданных id
$rows = $mv -> products -> select(array("id->in" => "7,32,56", "order->in" => "7,32,56"));

"order->" => "random" - сортировка результатов выборки в случайном порядке

//3 статьи в случайном порядке
$rows = $mv -> articles -> select(array("order->" => "random", "limit->" => 3));

"limit->" => "value" - ограничение количества результатов выборки (подробнее в разделе Постраничная разбивка)

//3 фотографии, которые доступны для размещение на главной странице
$rows = $mv -> photos -> select(array("index_page" => 1, "limit->" => "3"));

//Последние события, 3 страница при выводе 10 событий на страницу
$rows = $mv -> events -> select(array("order->desc" => "date", "limit->" => "20,10"));

"table->" => "value" - указание таблицы к которой направлен запрос (по умолчанию берется таблица модели, из которой вызывается метод)

//Все активные комментарии к статье
$rows = $mv -> articles -> select(array("active" => 1, "parent" => 45 "table->" => "comments"));

//Часто применяется внутри метода модели,
//когда нужно обратиться к другой таблице
$this -> select(array("table->" => "people", "event_id" => 3));

"group->by" - группировка результатов по заданному полю (SQL оператор "GROUP BY")

//Все производители товаров в данном каталоге
$conditions = array("active" => 1, "group->by" => "producer", "parent" => $catalog -> id, "fields->" => "id");
$current_producers = $mv -> products -> selectColumn($conditions);

"extra->" => "sql query" - дополнительные условия запроса в обыкновенном SQL формате. Добавляются после всех условий оператора "WHERE" в SQL запросе. Используется для передачи в запрос сложных условий со скобками и/или условием "OR".

$mv -> photos -> select(array("active" => 1, "extra->" => "((`type`='ceiling' AND `square`<='38' AND `square`>='7')OR `type` IN('wall', 'table', 'floor'))"));

Внимание! Конструктор запросов используется для быстрого извлечения данных по наиболее распространенным сценариям. Он не охватывает всего многообразия SQL конструкций. Для построения любых SQL запросов используются прямые запросы.

Предыдущий раздел

Методы форм

Следующий раздел

Прямые запросы