@PSmirnov

Как выполнить жадную загрузку для вложенной (каскадной) связи 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.
ПС. Полного понимания структуры фреймворка пока нет - изучаю вторую неделю.
  • Вопрос задан
  • 331 просмотр
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Никаких join в связях не надо, нужна цепочка связей и запрос типа:
$cityes = City::find()->joinWith('country')->orderBy('country_table_name.country_name')->all();

или для dataProvider
$query = City::find()->joinWith('country');
обратите внимание, что country_table_name - это имя таблицы, а не связи. В defaultOrder тоже имя таблицы должно быть. Ошибка у Вас или из-за этого или из-за того, что join не сделали.
Join из связи надо убирать. Для того что Вы пытаетесь сделать есть viaTable
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы