В этой записи поговорим про группировку SQL запросов с помощью ActiveRecord модели.
Группировка запросов используется для того, чтобы разделять логику запроса.
Пример
Например, у вас есть таблица orders
(товары), в которой есть:
client_id
(ID клиента)admin_id
(ID администратора)title
(заголовок)
И перед вами стоит задача сделать запрос: найти все товары, созданные клиентом или администратором, с заголовком «Шины» или «Диски».
В Yii2, ваш запрос к базе может быть следующим (представим, что у вас уже есть ActiveRecord модель orders
):
<?php $clientId = 1; $adminId = 2; $query = Orders::find()->select(['id']); $query->where(['or', ['client_id' => $clientId, 'title' => 'Шины',], ['client_id' => $clientId, 'title' => 'Диски'], ['admin_id' => $adminId, 'title' => 'Шины'], ['admin_id' => $adminId, 'title' => 'Диски'], ]);
Объяснение
Что мы получаем:
Orders::find()
создает нам новую поисковую модель, далее мы используем метод where(), который может принимать не только массивы. Первым аргументом может быть or
, where
, like
и прочее. Нас интересует or
.
SQL Результат
Результатом примера выше получится следующий SQL запрос:
SELECT `id` FROM `orders` WHERE (`client_id`=1 AND `title`='Шины') OR (`client_id`=1 AND `title`='Диски') OR (`admin_id`=2 AND `title`='Шины') OR (`admin_id`=2 AND `title`='Диски');