В статье рассмотрим функции и приведем примеры работы со связанными таблицами. Рассмотрим таблицу Country (Страны) известную нам из предыдущих 2 статей. Таблица включает в себя поля номер (id), название страны (name), количество жителей (number) и площадь (area).
К таблице со странами добавим подчиненную таблицу City (города). Связь между таблицами определяется как один ко многим, одна страна включает несколько городов.
Таблица содержит 3 поля это Номер (id), название города (cname) и внешний ключ соединяющий эту таблицу с родительской таблицей страны (fkey).
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() функция возвращает данные если есть связь между полями. Выберем все страны из таблицы 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() функция связи использующаяся в построителе запросов. Выберем все страны и соответсвующие им города.
Напишем запрос для вывода данных
// выполняем запрос, за место функции 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