2017-08-01 26 views
0

我在城市周圍做了一個樣本,城市有地區,有複合體和公寓。最後,我需要獲得某個城市的公寓,指出相關的過濾器(地區,複雜等)。目前我這樣做:來自數據庫的最佳抽樣

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, 
    ]); 
} 

但它看起來有點歪,也許我走錯了方向,我可以做得更好嗎?

UPD:我的確喜歡Yasin Patel。

$cities = Cities::find() 
     //->select('cities.id') // list your attributes comma saperated 
     ->leftJoin('districts','cities.id=districts.city_id') // join districts table 
     ->leftJoin('complex','districts.id=complex.district_id') // join complex table 
     ->leftJoin('apartment','complex.id=apartment.complex_id') // join apartment table 
     ->where(['cities.id' => Yii::$app->request->get('city_id')]) 
     ->andWhere(['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' => $cities, 
    ]); 

返回:

[ 
    { 
     "name":"City1", 
     "region":{ 
     "id":7, 
     "name":"Region city1." 
     } 
    } 
] 

但現在該怎麼選擇所有的公寓發現了什麼?

+0

應用程序使用ActiveDataProvider與此查詢會更好,而不是獲取所有行並使用ArrayProvider過濾它。 – Bizley

回答

0

原來以優化這樣的代碼::

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, 
    ]); 
} 

感謝大家的幫助。

0

試試這個查詢。

$cities = Cities::find() 
    ->select('city.id') // list your attributes comma saperated 
    ->leftJoin('districts','city.id=districts.city_id') // join districts table 
    ->leftJoin('complexes','districts.id=complexes.districts_id') // join complexes table 
    ->leftJoin('apartments','complexes.id=apartments.complexe_id') // join apartments table 
    ->where(['id' => Yii::$app->request->get('city_id')]) 
    ->andWhere(['city.id' => Yii::$app->request->get('district_id')]) 
    ->andWhere(['districts.id' => Yii::$app->request->get('district_id')]) 
    ->andWhere(['complexes.id' => Yii::$app->request->get('complex_id')])  
    ->andWhere(['complexes.type_id' => Yii::$app->request->get('complex_type_id')])  
    ->andWhere(['complexes.developer_id' => Yii::$app->request->get('developer_id')])  
    ->andWhere(['apartments.amount_room' => Yii::$app->request->get('amount_room')])  
    ->andWhere(['apartments.yardage' => Yii::$app->request->get('yardage')])  
    ->andWhere(['apartments.level' => Yii::$app->request->get('level')])  
    ->andWhere(['apartments.price' => Yii::$app->request->get('price')])  
    ->asArray(); 

根據需要使用您的表名稱和屬性名稱。 比在ArrayDataProvider中使用此查詢。

return new ArrayDataProvider([ 
     'allModels' => $query, 
    ]); 

這將以陣列形式返回記錄。

+0

我更新了答案,請參閱 – edvardpotter