Оптимальная выборка из бд

284
02 августа 2017, 22:37

Делаю выборку по городу, у города есть районы, у них комплексы, а у комплексов квартиры.В конечном итоге мне нужно получить квартиры для определенного города, с указанием сопутствующих фильтров(район,комплекс и т.д). На данный момент сделал так:

public function actionIndex()
{
    $cities = Cities::find()->where(['id' => Yii::$app->request->get('city_id')])->with([
        'districts' => function ($query){
            $query->filterWhere([
                'id' => Yii::$app->request->get('district_id'),
            ]);
        },
        'districts.complexes' => function ($query) {
            $query->filterWhere([
                'id' => Yii::$app->request->get('complex_id'),
                'type_id' => Yii::$app->request->get('complex_type_id'),
                'developer_id' => Yii::$app->request->get('developer_id'),
            ]);
        },
        'districts.complexes.apartments' => function ($query) {
            $query->filterWhere([
                'amount_room' => Yii::$app->request->get('amount_room'),
                'yardage' => Yii::$app->request->get('yardage'),
                'level' => Yii::$app->request->get('level'),
                'price' => Yii::$app->request->get('price'),
            ]);
        },
    ])->all();
    $query = [];
    foreach ($cities as $city) {
        foreach ($city->districts as $district) {
            foreach ($district->complexes as $complex) {
                foreach ($complex->apartments as $apartment) {
                    $query[] = $apartment;
                }
            }
        }
    }
    return new ArrayDataProvider([
        'allModels' => $query,
    ]);
}

Но выглядит как-то костыльно, возможно я пошел не тем путем, и можно сделать оптимальнее?

Answer 1

Нашел такое решение:

public function actionIndex()
{        
    $query = Apartment::find()
        ->joinWith('complex')
        ->joinWith('complex.district')
        ->joinWith('complex.district.city')
        ->where(['cities.id' => Yii::$app->request->get('city_id')])
        ->filterWhere(['districts.id' => Yii::$app->request->get('district_id')])
        ->filterWhere(['complex.id' => Yii::$app->request->get('complex_id')])
        ->filterWhere(['complex.type_id' => Yii::$app->request->get('complex_type_id')])
        ->filterWhere(['complex.developer_id' => Yii::$app->request->get('developer_id')])
        ->filterWhere(['apartment.amount_room' => Yii::$app->request->get('amount_room')])
        ->filterWhere(['apartment.yardage' => Yii::$app->request->get('yardage')])
        ->filterWhere(['apartment.level' => Yii::$app->request->get('level')])
        ->filterWhere(['apartment.price' => Yii::$app->request->get('price')]);
    return new ActiveDataProvider([
        'query' => $query,
    ]);
}
READ ALSO
Не работает bootstrap на nginx + php-fpm

Не работает bootstrap на nginx + php-fpm

Кладу в папку с сайтом все нужный файлы и indexphp в итоге рисует мне страничку, но без стилей

336
Эффективна ли функция sleep()?

Эффективна ли функция sleep()?

Добрый день, хотим запустить скрипт, который рандомом на протяжении всего дня будет запускать различные функции

254
Запуск bat-файла на удаленном сервере

Запуск bat-файла на удаленном сервере

Как запустить bat-файл на удаленном сервере через ssh2 php?

430