1

いくつか$query->andFilterWhere(...)を使用してクエリを作成します。

そして、最終的なクエリを見ることができますecho $query->createCommand()->rawSql;

最終クエリをコピーして phpmyadmin に貼り付けると、2 つのレコードがフェッチされましたが、ActiveDataProvider に結果が見つかりませんでした。

私がそれを見逃しているポイントはどこですか?!

============================================

これは私のコードです:

    $query = Camera::find();
$post = Yii::$app->request->post();
$post2 = array_filter((array)$post);

if( count($post2) >0 ){
    foreach($post2 as $k=>$v){
        $query->andFilterWhere([ 'Like' , $k , $v ]);
    } 
}

if($post['State'] > 0){
    $branches = Branch::find()->joinWith('city')->where('state_id='.((int)$post['State']))->all();
    foreach( $branches as &$v){
        $v = $v->brch_id;
    }
    $query->andFilterWhere([ 'IN' , 'brch_id' , $branches ]);    
}

echo $query->createCommand()->rawSql;

$dataProvider = new ActiveDataProvider([
    'query' => $query,
]);
4

2 に答える 2

0

あなたのコードでは

if( count($post2) >0 ){ // that means all fields filled
    foreach($post2 as $k=>$v){
        $query->andFilterWhere([ 'Like' , $k , $v ]);
    }
}

そしてその直後に のチェックが$post['State']あり、それを に使用していjoinWithます。どのような検索を使用しているのか (またはどのようなフォームを作成したのか) はわかりませんがState、この両方のモデルで検索しているようです...それは正しい動作ですか?

それが正しければ、あなたのために働いた生のSQLクエリを見せてもらえますActiveDataProviderか?

そして、この検索にクラスを使用してから拡張しないのはなぜCameraですか?

これは次のようになります。

public $state // fields that you Camera model don't have.

public function search($params){
    $query = Camera::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    $query->andFilterWhere('like', 'attribute', $this->attribute);
    // same for the others attributes here...

    $query->joinWith(['nameOfRelationWithBranch' => function ($queryBranch) {
        $queryBranch->joinWith(['city' => function ($queryCity) {
            $queryCity->andFilterWhere('state_id', $this->state);
        }]);
    }]);

//echo $query->createCommand()->rawSql;
return $dataProvider;

}

于 2016-01-31T14:42:56.043 に答える