kilimandjaro
@kilimandjaro
web developer

Как лучше построить дерево с городами в Yii2?

Возникла задача выстроить города в древовидную структуру. Я вижу 3 варианта сделать это

Массивы
$counties = Country::find()->asArray()->all();
    $districts = District::find()->asArray()->all();
    foreach (City::find()->all() as $city) {
        $cities [$this->getCountryName($counties, $city->country_id)]
        ... [districts][regions] ...
    }


Объекты AR
foreach (City::find()->all() as $city) {
        $counties = Country::findOne($city->country_id);
        $region = Region::findOne($city->region_id);
        $cities [$county->name] //forming array
        ... [$region->name][regions] ...
    }


Использовать DataProvider
$counties = new ActiveDataProvider(['query'=> Country::find()])
    $districts = new ActiveDataProvider(['query'=> District::find()])
    foreach (City::find()->all() as $city) {
        $cities [$counties->query-select(...)]
        ... [$counties->query-select(...)] ...
    }


Я сейчас реализовал 2м способом, объектами AR, но страничка долго грузится, для всего 3500 городов. С массивами тоже пробовал, тоже грузилась долго (все тесты на локалхосте)
  • Вопрос задан
  • 848 просмотров
Решения вопроса 1
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Использую для этого нативные связи в фреймворке.

$city = City::findOne( ... );
$city->region->country


или в обратную сторону

$country = Country::findOne( ... );
foreach( $country->regions as $region ) {
    foreach ( $region->cities as $city ) {
        echo $city->name
    }
}


Не забывать о жадной загрузке with() и кэширование через Yii::$app->db->cache( function () {} ) с использованием зависимостей.

Добавлено:

1. Почитайте о связях: www.yiiframework.com/doc-2.0/guide-db-active-recor...
2. Почитайте о жадной и ленивой загрузке: www.yiiframework.com/doc-2.0/guide-db-active-recor...
3. Почитайте о кэшировании результатов запросов: www.yiiframework.com/doc-2.0/guide-caching-data.ht...
4. Почитайте о зависимостях: www.yiiframework.com/doc-2.0/guide-caching-data.ht...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Подключите кэш, ну и подумайте над логикой
Ответ написан
Ваш ответ на вопрос

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

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