@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.
ПС. Полного понимания структуры фреймворка пока нет - изучаю вторую неделю.
  • Вопрос задан
  • 327 просмотров
Пригласить эксперта
Ответы на вопрос 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы