Yii2: Группировка SQL запросов с ActiveRecord

Yii2: Группировка SQL запросов с ActiveRecord

· Yii2, Снипеты и Фреймворки · 1 мин чтения
AnyComment - Современный виджет комментариев для WordPress

В этой записи поговорим про группировку 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, wherelike и прочее. Нас интересует 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`='Диски');