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

1

问题是这个循环:

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

我只是将其替换为:

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

完成,解决!!!!:|

于 2016-02-02T06:30:59.430 回答
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 回答