Конструктор запросов
Для быстрого извлечения данных моделей в 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'))"));
"field->m2m" => "value" - извлечение данных по полю многие ко многим, в качестве значения передается id записи противоположной модели
//Все новости по тэгу с id=24, тэги и новости связаны соотношением многие ко многим $mv -> news -> select(array("active" => 1, "tag->m2m" => 24));
Внимание! Конструктор запросов используется для быстрого извлечения данных по наиболее распространенным сценариям. Он не охватывает всего многообразия SQL конструкций. Для построения любых SQL запросов используются прямые запросы.
Предыдущий раздел
Методы форм