Как выполнить жадную загрузку для вложенной (каскадной) связи Yii2?
Есть три таблицы, например, country (id, country_name), region(id, country_id, region_name), city (id, region_id, city_name), связь один ко многим. Выполняю вывод данных по городам в GridView, удалось все настроить, работают все фильтры и сортировки. Только для получения названия страны происходят единичные обращения к БД? Подозреваю, нужно как-то изменить геттеры.
Геттер в City:
public function getCountrylName()
{
return $this->region->country->country_name;
}
связь в модели City:
public function getCountry()
{
$query = $this->hasOne(Region::className(), [id' => 'region_id']);
return $query->joinWith('country');
}
По возможности опишите подробнее алгоритм, чтобы было направление куда копать, может по такому вопросу есть мануал?
Второй вопрос. Как организовать в выводе городов сортировку по умолчанию по country_name? Добавление в dataProvider модели CitySearch 'defaultOrder' => ['country.country_name'=>SORT_ASC] выдает ошибку. Если запрос на сортировку включить в строку для роутинга - выдает 404.
ПС. Полного понимания структуры фреймворка пока нет - изучаю вторую неделю.
или для dataProvider $query = City::find()->joinWith('country');
обратите внимание, что country_table_name - это имя таблицы, а не связи. В defaultOrder тоже имя таблицы должно быть. Ошибка у Вас или из-за этого или из-за того, что join не сделали.
Join из связи надо убирать. Для того что Вы пытаетесь сделать есть viaTable
Возможно мы друг друга не понимаем. Мне нужно получить данные из связанной через таблицу таблицы. Город-область-страна. Как выглядит предлагаемая вами цепочка связей? hasOne на результат другого hasOne не сделать, а предлагаемый вами запрос $query = City::find()->joinWith('country'); начинает искать связь getCountry в объекте класса City, но прямой связи нет, только через другую таблицу. Метод viaTable пробовал, тоже работает, были некоторые ошибки при сортировке, пришел к описанному выше методу.
Нужный функционал я получил, но в академических целях хотелось бы сократить число запросов в БД.