Я использую некоторые $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,
]);
Проблема была в этом цикле:
foreach( $branches as &$v){
$v = $v->brch_id;
}
Я просто заменяю это:
$a = [];
foreach( $branches as $v){
$a[] = (int)$v->brch_id;
}
и СДЕЛАНО, РЕШЕНО !!!!! : |
В вашем коде у вас есть
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;
}