Работа с запросами в Yii 2.x. Связи между таблицами (часть 3)

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

К таблице со странами добавим подчиненную таблицу  City (города). Связь между таблицами определяется как один ко многим, одна страна включает несколько городов.

Таблица содержит 3 поля это Номер (id), название города (cname) и внешний ключ соединяющий эту таблицу с родительской таблицей страны (fkey).

With(), JoinWith()

with(), JoinWith() функции связи таблиц. Выберем все страны и соответсвующие им города. Перед тем как работать со связями у нас в модели Country необходимо прописать функцию связи

    //функция связи модели Country c City
    public function getCity()
    {
        return $this->hasMany(City::className(), ['fkey' => 'id']);
    }

Напишем запрос для вывода данных

     // выполняем запрос, за место функции joinWith можно использовать функцию With
     $model = Country::find()->joinWith('city')->all(); 
	    // цикл по модели Country
            foreach ($model as $m) {
	         // обращение к модели City
                 $city = $m->city;
                 echo $m->name;
                 foreach ($city as $c) {
                        echo $c->cname;
                   }
            }   

Результат вывода: 

Россия Санкт-Петербург Архангельск Москва 
Румыния Бухарест Галац 
США Вашингтон 
Германия 

InnerJoinWith()

InnerJoinWith() функция возвращает данные если есть связь между полями. Выберем все страны из таблицы Country у которых есть соответсвующие города в таблице City.

Напишем запрос для вывода данных
     // выполняем запрос, за место функции joinWith можно использовать функцию With
     $model = Country::find()->innerjoinWith('city')->all(); 
	    // цикл по модели Country
            foreach ($model as $m) {
	         // обращение к модели City
                 $city = $m->city;
                 echo $m->name;
                 foreach ($city as $c) {
                        echo $c->cname;
                   }
            }   

Результат вывода: 

Россия Санкт-Петербург Архангельск Москва 
Румыния Бухарест Галац 
США Вашингтон 

У Германии нет соответствующих городов, поэтому вывода ее не последовало

Join()

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

Напишем запрос для вывода данных
     // выполняем запрос, за место функции joinWith можно использовать функцию With
     // Создаем объект
     $model = new Query;
     // формируем запрос
     $model->select(['*'])->from('country')->join('LEFT OUTER JOIN', 'city','country.id = city.fkey');
     // выполняем запрос
     $command = $model->createCommand();
     $model = $command->queryAll();	
	    // цикл по данным из запроса
            foreach ($model as $m)
                 // вывод страны и города 	
                 echo $m['name'].' '.$m['cname'];
       

Результат вывода: 

Россия Санкт-Петербург
Россия Архангельск
Россия Москва
Румыния Бухарест
Румыния Галац
США Вашингтон
Германия  

Join() функция связи использующаяся в построителе запросов.  Выберем все страны из таблицы Country у которых есть соответствующие города в таблице City.

      // Создаем объект
     $model = new Query;
     // формируем запрос
     $model->select(['*'])->from('country')->join('INNER JOIN', 'city','country.id = city.fkey');
     // выполняем запрос
     $command = $model->createCommand();
     $model = $command->queryAll();	
	    // цикл по данным из запроса
            foreach ($model as $m)
                 // вывод страны и города 	
                 echo $m['name'].' '.$m['cname'];
       

Результат вывода: 

Россия Санкт-Петербург
Россия Архангельск
Россия Москва
Румыния Бухарест
Румыния Галац
США Вашингтон

Можно непосредственно работать с базой данной. Перепишем последний запрос:

      // Соединение с базой данной
     $connection = \Yii::$app->db;
     // выполняем запрос
     $command = $connection->createCommand('Select * From Country Inner Join City On country.id = city.fkey');
     $model = $command->queryAll();	
	    // цикл по данным из запроса
            foreach ($model as $m)
                 // вывод страны и города 	
                 echo $m['name'].' '.$m['cname'];
       

Результат вывода: 

Россия Санкт-Петербург
Россия Архангельск
Россия Москва
Румыния Бухарест
Румыния Галац
США Вашингтон

Итак, в данной статье мы рассмотрели основные методы и привели примеры при работе со связанными таблицами в Yii 2.x