Yii2. Работа с ActiveRecord

 

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;Копировать
Источник: Перейти
Комментарии (0):
Чтобы оставить свой комментарий, необходимо пройти аутентификацию