Yii2. Работа с ActiveRecord

17.03.2019

Теги: PHPWeb-разработкаYii2БазаДанныхЗапросТеорияФреймворк

ActiveRecord обеспечивает объектно-ориентированный интерфейс для доступа и манипулирования данными, хранящимися в базе данных. Класс ActiveRecord соответствует таблице в базе данных, объект ActiveRecord соответствует строке этой таблицы, а атрибуты объекта ActiveRecord представляют собой отдельные поля строки.

Вместо непосредственного написания SQL-запросов можно получать доступ к атрибутам ActiveRecord и вызывать методы ActiveRecord для доступа и манипулирования данными, хранящимися в таблицах базы данных.

Объекты ActiveRecord являются моделями. Именно поэтому для классов ActiveRecord задается пространство имён app\models. Класс yii\db\ActiveRecord наследует класс yii\base\Model, он обладает всеми возможностями моделей, такими как атрибуты, правила валидации, способы сериализации данных и т.д.

После объявления класса ActiveRecord можно использовать его для получения данных из соответствующей таблицы базы данных. Этот процесс состоит из трёх шагов:

  • Создать новый объект запроса вызовом метода yii\db\ActiveRecord::find()
  • Настроить объект запроса вызовом методов построения запросов
  • Вызвать метод получения данных для извлечения записей в виде объектов ActiveRecord

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

Получить все записи таблицы БД category в виде коллекции объектов:

$categories = Category::find()->all();
SELECT * FROM `category`

Можно получить записи таблицы в виде массива. Это позволит уменьшить кол-во запросов к БД для получения данных:

$categories = Category::find()->asArray()->all();

Получить все записи таблицы БД category и отсортировать их по полю id, по убыванию:

$categories = Category::find()->orderBy(['id' => SORT_DESC])->all();
SELECT * FROM `category` ORDER BY `id` DESC

Получить записи таблицы БД product, для которых поле category_id равно единице:

$products = Product::find()->where(['category_id' => 1])->all();
$products = Product::find()->where('category_id=1')->all();
SELECT * FROM `product` WHERE `category_id` = 1

Получить записи таблицы БД product, для которых WHERE `name` LIKE '%первый%':

$products = Product::find()->where(['LIKE', 'name', 'первый'])->all();
SELECT * FROM `product` WHERE `name` LIKE '%первый%'

Получить записи таблицы БД product, для которых поле id меньше или равно 2:

$products = Product::find()->where(['<=', 'id', 2])->all();
SELECT * FROM `product` WHERE `id` <= 2

Ограничить кол-во записей выборки из таблицы БД product:

$products = Product::find()->where(['category_id' => 1])->limit(2)->all();
SELECT * FROM `product` WHERE `category_id` = 1 LIMIT 2

Получить только первую запись выборки из таблицы БД product:

$product = Product::find()->where(['category_id' => 1])->one();
SELECT * FROM `product` WHERE `category_id`=1

Обратите внимание, что метод one() возвращает один объект, а не коллекцию объектов. Хотя результат SQL-запроса может содержать несколько записей. Так что результат, возвращенный методом one(), перебрать в цикле не получится. Этот метод предназначен для получения из БД только одной записи:

$product = Product::find()->where(['id' => 2])->one();

Подсчитать кол-во записей, которые вернет запрос к таблице БД product:

$count = Product::find()->where(['category_id' => 1])->count();
SELECT COUNT(*) FROM `product` WHERE `category_id` = 1

Выбрать из таблицы БД product записи с идентификаторами 1, 2 и 3:

$products = Product::find()->where(['IN', 'id', [1,2,3]])->all();
SELECT * FROM `product` WHERE `id` IN (1, 2, 3)

Выбрать из таблицы БД product записи, у которых идентификаторы не 1, 2 и 3:

$products = Product::find()->where(['NOT IN', 'id', [1,2,3]])->all();
SELECT * FROM `product` WHERE `id` NOT IN (1, 2, 3)

Методы findOne() и findAll()

Т.к. извлечение данных по первичному ключу или значениям отдельных столбцов достаточно распространённая задача, Yii2 предоставляет два коротких метода для её решения:

  • yii\db\ActiveRecord::findOne(): возвращает один объект ActiveRecord, заполненный первой строкой результата запроса.
  • yii\db\ActiveRecord::findAll(): возвращает массив объектов ActiveRecord, заполненных всеми полученными результатами запроса.

Оба метода могут принимать параметры в одном из следующих форматов:

  • скалярное значение: значение интерпретируется как первичный ключ, по которому следует искать
  • массив скалярных значений: массив интерпретируется как набор первичных ключей, по которым следует искать
  • ассоциативный массив: ключи массива интерпретируются как названия столбцов, а значения — как содержимое столбцов, которое следует искать

Получить запись таблицы БД product по значению первичного ключа:

$product = Product::findOne(1);
SELECT * FROM `product` WHERE `id`=1

Получить записи таблицы БД product по значениям первичного ключа:

$products = Product::findAll([1, 2, 3]);
SELECT * FROM `product` WHERE `id` IN (1, 2, 3)

Запросы на «чистом» SQL

Помимо использования методов построения запросов можно также писать запросы на «чистом» SQL для получения данных:

$query = "SELECT * FROM `product` WHERE `name` LIKE '%первый%'";
$products = Product::findBySql($query)->all();
$query = "SELECT * FROM `product` WHERE `name` LIKE :search";
$products = Product::findBySql($query, [':search' => '%первый%'])->all();

Доступ к данным

Как сказано выше, получаемые из базы данные заполняют объекты ActiveRecord и каждая строка результата запроса соответствует одному объекту ActiveRecord. Доступ к значениям столбцов можно получить с помощью атрибутов этих объектов.

// `id` и `name` — названия стробцов в таблице БД `product`
$product = Product::findOne(1);
$id = $product->id;
$name = $product->name;

Дополнительно

Поиск: PHP • Web-разработка • Yii2 • База данных • Запрос • Фреймворк • Запрос • ActiveRecord • find • all • one • findAll • findOne • where • SQL

Каталог оборудования
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Производители
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Функциональные группы
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.