代码之家  ›  专栏  ›  技术社区  ›  edvardpotter

从数据库中优化采样

  •  0
  • edvardpotter  · 技术社区  · 7 年前

    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 :我几乎喜欢亚辛·帕特尔。

    $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 回复  |  直到 7 年前
        1
  •  0
  •   Yasin Patel    7 年前

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

    这将以数组形式返回记录。

        2
  •  0
  •   edvardpotter    7 年前

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

    谢谢大家的帮助。