Конструктор запросов
Для быстрого извлечения данных из моделей в MV используются специальные методы, которые обращаются к конструктору SQL запросов.
Примеры использования конструктора запросов
//Запросы внутри класса модели
$rows = $this -> select(['order->desc' => 'date', 'limit->' => 21,7]);
$rows = $this -> select(['parent' => 7, 'active' => 1, 'in_menu' => 1, 'order->asc' => 'order']);
//Запросы из шаблона
$page = $mv -> pages -> find(34);
$block_content = $mv -> blocks -> find(['id' => 1, 'active' => 1]);
$last_article = $mv -> articles -> selectOne(['order->desc' => 'active' => 1]);
$total_active = $mv -> events -> countRecords(['active' => 1]);
Методы модели, использующие конструктор запросов, в качестве параметра все используют массив с параметрами для SQL запроса и обращаются к таблице модели. Если параметры не были переданы, либо передан пустой массив, то будут извлечены все записи из таблицы модели.
- select() - возвращает ассоциированный массив записей из базы данных, удовлетворяющих условиям поиска, индексы массива - id записей
- selectOne() - возвращает ассоциированный массив, с полями одной записи
- selectColumn() - возвращает одномерный индексный массив со значениями нужной колонки, параметр 'fields->' обязателен
- countRecords() - возвращает целое число, которое является количеством полей удовлетворяющих заданным условиям, без условий посчитает все записи
- find() - тоже что и selectOne(), но если искомая запись была найдена, то возвращается объект класса Record, если запись не найдена, то вернется null
//Поиск активной страницы по URL
$content = $mv -> pages -> find(['url' => 'contact', 'active' => 1]);
echo $content -> name;
echo $content -> content;
//Построение списка меню
public function displayMenu($parent)
{
$rows = $this -> select(['parent' => $parent,
'active' => 1,
'in_menu' => 1,
'order->asc' => 'order']);
foreach($rows as $row)
{
...
}
}
//Построение ленты новостей с учетом пагинации
public function display()
{
$rows = $this -> select(['order->desc' => 'date',
'limit->' => $this -> paginator -> getParamsForSQL()]);
foreach($rows as $row)
{
...
}
}
Параметры для конструктора SQL запросов
'field' => 'value' - параметры вида ‘ключ-значение’, проверка на равенство
//Все записи в родительском разделе id=32
$rows = $this -> select(['parent' => 32]);
//Записи с определенными id в виде массива
$rows = $this -> select(['id' => [1,5,12]]);
//Все новости из раздела Спорт, которые одобрены для публикации
$rows = $mv -> news -> select(['type' => 'sport', 'active' => 1]);
//Все новости определенных категорий
$rows = $mv -> news -> select(['type' => ['sport', 'life', 'relax'], 'active' => 1]);
//Корпоративные клиенты с подтвержденной регистрацией за конкретную дату
$rows = $mv -> clients -> select(['group' => 'copropate', 'confirm' => 1, 'date' => '2023-07-24']);
'field(!=, >, <, >=, <=)' => 'value' - параметры вида ‘ключ-значение’, проверка на неравенство и другие условия
//Все записи кроме типа с id=7
$rows = $this -> select(['type!=' => 7]);
//Товары с ценой больше 450
$rows = $this -> select(['price>' => 450]);
//Книги объемом более 300 страниц, поступившие за определенный временной интервал
$rows = $mv -> books -> select(['pages>=' => 300, 'date>=' => '2022-02-21', 'date<=' => '2024-05-07']);
'fields->' => 'aaa, bbb, ccc' - ограничение полей для выборки, по умолчанию берутся все поля таблицы
//Взять названия и содержания всех активных блоков
$rows = $mv -> blocks -> select(['active' => 1, 'fields->' => 'name,content']);
'field->in' => '1,2,3' - перечисление возможных значений параметра
//Выбрать товары с id равными 3, 64, и 9, которые отображаются в меню
$rows = $mv -> products -> select(['id->in' => '3,64,9', 'in_menu' => 1]);
//Выбрать новости из разделов 1,3,4,7 и 12
$rows = $mv -> news -> select(['theme->in' => '1,3,4,7,12']);
//Вариант с массивом
$rows = $mv -> news -> select(['theme' => [1,3,4,7,12]]);
'field->not-in' => '1,2,3' - перечисление значений, которым не должен удовлетворять параметр
//Выбрать всех клиентов, кроме перечисленных
$rows = $mv -> clients -> select(['id->not-in' => '3,77,91']);
'field->like' => 'abc' - сравнение со строковым значением
//Все клиенты, у которых в фамилии присутствует 'иван'
$rows = $mv -> clients -> select(['last_name->like' => 'иван']);
'field->not-like' => 'abc' - сравнение с отсутствием строкового значения
//Все страницы, у которых в заголовках отсутствует 'магазин'
$rows = $mv -> pages -> select(['title->not-like' => 'магазин']);
'order->asc' => 'field', 'order->desc' => 'field' - сортировка результатов выборки, подробнее в разделе Сортировка
//Статьи по дате публикации, вначале самые поздние
$rows = $mv -> articles -> select(['order->desc' => 'date']);
//Товары раздела по цене, вначале дешевые
$rows = $mv -> products -> select(['catalog' => 49, 'order->asc' => 'price']);
'order->double' => 'field->direction' - дополнительная двойная сортировка результатов выборки, применяется совместно с 'order->asc' => 'field' или 'order->desc' => 'field'
//Статьи по дате публикации и дополнительно по рейтингу, в начале самые популярные
$rows = $mv -> articles -> select(['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(['id->in' => '7,32,56', 'order->in' => '7,32,56']);
'order->' => 'random' - сортировка результатов выборки в случайном порядке
//3 статьи в случайном порядке
$rows = $mv -> articles -> select(['order->' => 'random', 'limit->' => 3]);
'limit->' => 'value' - ограничение количества результатов выборки, подробнее в разделе Постраничная разбивка
//3 фотографии, которые доступны для размещение на главной странице
$rows = $mv -> photos -> select(['index_page' => 1, 'limit->' => '3']);
//Последние события, 3 страница при выводе 10 событий на страницу
$rows = $mv -> events -> select(['order->desc' => 'date', 'limit->' => '20,10']);
'table->' => 'value' - указание таблицы к которой направлен запрос, по умолчанию берется таблица модели, из которой вызывается метод
//Все активные комментарии к статье
$rows = $mv -> articles -> select(['active' => 1, 'parent' => 45 'table->' => 'comments']);
//Часто применяется внутри метода модели, когда нужно обратиться к другой таблице
$this -> select(['table->' => 'people', 'event_id' => 3]);
'group->by' - группировка результатов по заданному полю
//Все производители товаров в данном каталоге
$conditions = ['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(['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(['active' => 1, 'tag->m2m' => 24]);
Предыдущий раздел
Методы форм