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;Копировать