Работа с запросами в Yii 2.x. Запрос выборки при работе с моделью (Active Record) (часть 1)

В Yii 2.x используется 3 типа запросов к базе данных, это: объекты доступа к данным (DAO), построитель запросов (Query) и объектно-ориентированный интерфейс манипуляцией базы данных (Active Record).

Рассмотрим список функций которые позволяют осуществлять выборку данных, для этого рассмотрим простую таблицу Country (Страны). Таблица включает в себя поля номер (id), название страны (name), количество жителей (number) и площадь (area).

Рассмотрим основной список функций для выборки данных из таблицы Country. По правилам MVC вывод информации осуществляется в представлении, но для того чтобы не загромождать описание методов и проверить результат, выведем данные в контроллере.

find()

find() осуществляет поиск записи из таблицы по ключевому полю. Выберем запись из таблицы страны и выведем название страны

//запрос
$model = Country::find()->one();
// вывод данных
if($model){
	echo $model->name;
}

Результатом выборки: Россия

one()

one() выборка одной записи из таблицы

all()

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()

select() осуществляет выборку определенных колонок таблицы. Выведем все названия стран и площадь стран.

    
//запрос
$model = Country::find()->select('name, area')->all();
// вывод данных
       if($model){
	 foreach ($model as $m){
	   echo $m->name;
           echo $m->area;
         }
       }

Результат выборки: Все страны и площади всех стран

Where(), orWhere(), andWhere

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()

count() осуществляет подсчет количества записей. Подсчитаем количество строк в таблице Country

//запрос
$model = Country::find()->count();
     if($model){
        echo $model;
     }

Результат выборки: 4

OrderBy()

orderBy()  осуществляет сортировку записей. Отсортируем  страны по алфавитному порядку.

//запрос
$model = Country::find()->orderby(['name'=>SORT_ASC])->all();
           // вывод данных
           if($model){
	       foreach ($model as $m){    
                 echo $m->name;
               }
             }

Результат выборки: Германия Россия Румыния США

AsArray()

asArray() осуществляет преобразование данных в массив. Переведем данные в массив и выведем страны

//запрос
$model = Country::find()->asArray()->all();
     // вывод данных  
     if($model){
	   foreach ($model as $m)
	       echo $m["name"];
      }

Результат выборки:  Россия Румыния США Германия

indexBy()

indexBy() осуществляет индексацию по определенному столбцу. Сделаем индексацию по столбцу id

//запрос
$model = Country::find()->indexBy('id')->all();

limit()

limit() определяет количество выбираемых записей.

offset()

limit() определяет c какой записи будет выборка. Выберем 2 страны начиная с третьей.

//запрос
$model = Country::find()->limit(2)->offset(2)->all();
         // вывод данных
         if($model){
    	   foreach ($model as $m)
    	       echo $m->name;
        }

Результат выборки:  США Германия

like

like устанавливает соответствие строки с шаблонами. Выберем страны в встречается буква м.

//запрос
$model = Country::find()->where(['LIKE''name''м'])->all();
         // вывод данных
         if($model){
    	   foreach ($model as $m)
    	       echo $m->name;
        }

Результат выборки:  Румыния Германия

in, not in

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()

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()

groupBy() группирует значения если они одинаковые. Сгруппируем страны по полю name

//запрос
$model = Country::find()->groupBy('name')->all();
         // вывод данных
         if($model){
    	   foreach ($model as $m)
    	       echo $m->name;
        }

Результат выборки:  Россия Румыния США Германия

having()

having() аналог оператора where(), только оператор having() работает с агрегатными функциями  count(), min(), max(), avg(), sum()

addParams()

addParams() добавляет параметр в условие. выберем страну у которой id=1 

//запрос
$model = Country::find()->where('id = :id')->addParams([':id' => $id])->one();
         // вывод данных 
         if($model){
    	        echo $model->name;
        }

Результат выборки:  Россия

findBySql()

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;
      }

Результат выборки:  Россия США

В этой статье мы рассмотрели список методов, которые осуществляют выборку данных при работе с моделью.