Yii2. Работа с ActiveRecord
17.03.2019
Теги: PHP • Web-разработка • 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;
Дополнительно
- Официальный сайт Yii: Active Record
- Работа с запросами в Yii2. Часть 1
- Работа с запросами в Yii2. Часть 2
- Работа с запросами в Yii2. Часть 3
- Работа с запросами в Yii2. Часть 4
Поиск: PHP • Web-разработка • Yii2 • База данных • Запрос • Фреймворк • Запрос • ActiveRecord • find • all • one • findAll • findOne • where • SQL