从数据库中进行最佳采样

时间:2017-08-01 07:40:17

标签: rest yii2 yii2-basic-app

我在城市周围做样品,城市有区域,有复合体和公寓大楼。最后,我需要获得某个城市的公寓,指示相关的过滤器(区域,复杂等)。目前我这样做了:

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."
      }
   }
]

但现在如何选择找到的所有公寓?

2 个答案:

答案 0 :(得分:0)

尝试此查询。

<input placeholder="Message&hellip;" />

根据需要使用您的表名和属性名称。 比在ArrayDataProvider中使用此查询。

$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();

这会将记录作为数组返回。

答案 1 :(得分: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,
    ]);
}

感谢大家的帮助。