Yii2-activedataprovider не получает данные

Я использую некоторые $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,
]);

person Masoud Nazari    schedule 31.01.2016    source источник
comment
Не могли бы вы опубликовать больше своего кода? Только по этой информации сложно ответить.   -  person slbteam08    schedule 31.01.2016
comment
Код добавлен. Помогите, пожалуйста...   -  person Masoud Nazari    schedule 31.01.2016
comment
Пожалуйста, добавьте то, что вы получаете в окончательный запрос. потому что этих деталей недостаточно, чтобы помочь вам. А также, пожалуйста, укажите, каково значение поста Yii::$app-›request-›post();   -  person Anamika Shrivastava    schedule 31.01.2016
comment
Что вы делаете после того, как создадите эту часть кода .. покажите остальное ..   -  person scaisEdge    schedule 31.01.2016
comment
Запрос на добавление строки работал с phpmyadmin.   -  person Insane Skull    schedule 01.02.2016


Ответы (2)


Проблема заключалась в этом цикле:

foreach( $branches as &$v){
    $v = $v->brch_id;
}

Я просто заменяю его на:

$a = [];
foreach( $branches as $v){
    $a[] = (int)$v->brch_id;
}

и ГОТОВО, решено!!!!! :|

person Masoud Nazari    schedule 02.02.2016

В вашем коде у вас есть

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;

}

person Clyff    schedule 31.01.2016