В Yii 2.x используется 3 типа запросов к базе данных, это: объекты доступа к данным (DAO), построитель запросов (Query) и объектно-ориентированный интерфейс манипуляцией базы данных (Active Record).
Рассмотрим список функций которые позволяют осуществлять выборку данных, для этого рассмотрим простую таблицу Country (Страны). Таблица включает в себя поля номер (id), название страны (name), количество жителей (number) и площадь (area).
Рассмотрим основной список функций для выборки данных из таблицы Country. По правилам MVC вывод информации осуществляется в представлении, но для того чтобы не загромождать описание методов и проверить результат, выведем данные в контроллере.
find() осуществляет поиск записи из таблицы по ключевому полю. Выберем запись из таблицы страны и выведем название страны
//запрос $model = Country::find()->one(); // вывод данных if($model){ echo $model->name; }
Результатом выборки: Россия
one() выборка одной записи из таблицы
all() выборка всех записей таблицы. Выведем всю таблицу страны
//запрос $model = Country::find()->all(); // вывод данных if($model){ foreach ($model as $m){ echo $m->id; echo $m->name; echo $m->area; echo $m->number; } }
Результат выборки: Все данные из таблицы Country
select() осуществляет выборку определенных колонок таблицы. Выведем все названия стран и площадь стран.
//запрос $model = Country::find()->select('name, area')->all(); // вывод данных if($model){ foreach ($model as $m){ echo $m->name; echo $m->area; } }
Результат выборки: Все страны и площади всех стран
where() условие для выборки. Выведем страну у которой id=4
$id = 4; //запрос $model = Country::find()->where('id = :id', [':id' => $id])->one(); // вывод данных if($model){ echo $model->name; }
Результат выборки: США
Выберем страну у которой id=1 и площадь составляет 17125407
$id = 1; $area = "17125407"; //запрос $model = Country::find()->where('id = :id', [':id' => $id])->andWhere('area = :area', [':area' => $area])->one(); // вывод данных if($model){ echo $model->name; }
Результат выборки: Россия
Выберем страны у которой id=1 и площадь составляет 238391
$id = 1; $area = "238391"; //запрос $model = Country::find()->where('id = :id', [':id' => $id])->orWhere('area = :area', [':area' => $area])->all(); // вывод данных if($model){ foreach ($model as $m){ echo $m->name; } }
Результат выборки: Россия и Румыния
where() условие для выборки. Выведем страну у которой id=4 и количество жителей 81459000
//запрос $model = Country::find()->where(['id' => 4, 'area' => 81459000])->one(); // вывод данных if($model){ echo $model->name; }
Результат выборки: Германия
count() осуществляет подсчет количества записей. Подсчитаем количество строк в таблице Country
//запрос $model = Country::find()->count(); if($model){ echo $model; }
Результат выборки: 4
orderBy() осуществляет сортировку записей. Отсортируем страны по алфавитному порядку.
//запрос $model = Country::find()->orderby(['name'=>SORT_ASC])->all(); // вывод данных if($model){ foreach ($model as $m){ echo $m->name; } }
Результат выборки: Германия Россия Румыния США
asArray() осуществляет преобразование данных в массив. Переведем данные в массив и выведем страны
//запрос $model = Country::find()->asArray()->all(); // вывод данных if($model){ foreach ($model as $m) echo $m["name"]; }
Результат выборки: Россия Румыния США Германия
indexBy() осуществляет индексацию по определенному столбцу. Сделаем индексацию по столбцу id
//запрос $model = Country::find()->indexBy('id')->all();
limit() определяет количество выбираемых записей.
limit() определяет c какой записи будет выборка. Выберем 2 страны начиная с третьей.
//запрос $model = Country::find()->limit(2)->offset(2)->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: США Германия
like устанавливает соответствие строки с шаблонами. Выберем страны в встречается буква м.
//запрос $model = Country::find()->where([
'LIKE'
,
'name'
,
'м'
])
->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: Румыния Германия
in множественное условие выборки. Выберем страны id=1,id=2,id=3.
//запрос $model = Country::find()->where([
'in'
,
'id'
, [1,2,3]
])
->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: Россия Румыния США
Выберем страны у которых номена id не равен 1, не равен 2, не равен 3
//запрос $model = Country::find()->where([
'not in'
,
'id'
, [1,2,3]
])
->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: Германия
between() выбираем значения между определенными значениями. Выберем страны у которых номер стоит между 1 и 3 (крайние значения 1 и 3 включаются в выборку).
//запрос $model = Country::find()->where([
'id between 1 and 3
'
]))
->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: Россия Румыния США
groupBy() группирует значения если они одинаковые. Сгруппируем страны по полю name
//запрос $model = Country::find()->groupBy(
'name'
)
->all(); // вывод данных if($model){ foreach ($model as $m) echo $m->name; }
Результат выборки: Россия Румыния США Германия
having() аналог оператора where(), только оператор having() работает с агрегатными функциями count(), min(), max(), avg(), sum()
addParams() добавляет параметр в условие. выберем страну у которой id=1
//запрос $model = Country::find()->where(
'id = :id'
)->addParams([':id' => $id])
->one(); // вывод данных if($model){ echo $model->name; }
Результат выборки: Россия
findBySql() выборка с помощью sql запроса. Выберем страны с численностью населения 146519759 и 322369319 человек
//запрос
$sql = 'Select name from Country where area = 146519759 and area = 322369319 '
$model = Country::findbysql($sql)->all();
// вывод данных
if($model){
foreach ($model as $m)
echo $model->name;
}
Результат выборки: Россия США
В этой статье мы рассмотрели список методов, которые осуществляют выборку данных при работе с моделью.