多值列表中的Yi2 gridview过滤器(非下拉列表过滤器)

多值列表中的Yi2 gridview过滤器(非下拉列表过滤器),gridview,yii2,yii2-basic-app,Gridview,Yii2,Yii2 Basic App,我的gridview数据 day modeler total 2018-1-05 ABC 5 2018-1-06 DEF 8 2018-1-06 CAB 3 2018-1-06 GHI 3 2018-1-06 KLM 3 我有一

我的gridview数据

    day          modeler    total  
    2018-1-05     ABC        5                         
    2018-1-06     DEF        8        
    2018-1-06     CAB        3   
    2018-1-06     GHI        3   
    2018-1-06     KLM        3   
我有一个这样的网格视图。现在只能逐个筛选modeler。我可以有一个多行搜索框,只需粘贴在“ABC DEF CAB”中,它将过滤3个结果,如下所示

day          modeler    total  
2018-1-05     ABC        5                         
2018-1-06     DEF        8        
2018-1-06     CAB        3
我的控制器

public function actionIndex()
{
    $searchModel = new ModelerSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render('index', [
        'searchModel' => $searchModel,
        'dataProvider' => $dataProvider,
    ]);
}
我的搜索模型

   public function search($params)
    {
        $query = Modeler::find();

        // add conditions that should always apply here

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

        $this->load($params);

        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }

        // grid filtering conditions
        $query->andFilterWhere([
            'id' => $this->id,
        ]);

        $query->andFilterWhere(['like', 'modeler', $this->modeler])
            ->andFilterWhere(['like', 'total', $this->total]);

        return $dataProvider;
    }
}

谢谢大家!

您需要通过gridview中的
modeler
字段进行搜索,您希望它的工作方式是,如果您输入
“ABC”
,它应该显示您匹配的记录,如果您输入
“ABC DEF”
,并带有空格,它应该显示两条与其中任何一条匹配的记录

因此,首先,在您的搜索模型之上添加

private $_selections = [];
然后将搜索功能更新为以下内容

public function search( $params ) {
    $query = Modeler::find ();

    // add conditions that should always apply here

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

    $this->load ( $params );

    if ( !$this->validate () ) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    if ( $this->modeler !== null && $this->modeler !== '' ) {
        $this->_selections = preg_split ( '/\s+/i' , $this->modeler );
        $query->andFilterWhere ( [ 'IN' , 'modeler' , $this->_selections ] );
    }
    // grid filtering conditions
    $query->andFilterWhere ( [
        'id' => $this->id ,
    ] );

    $query->andFilterWhere ( [ 'like' , 'total' , $this->total ] );

    return $dataProvider;
}

现在转到您的gridview,在过滤器输入的
modeler
列中键入“ABC DEF”,并观察它的发生。

无法理解“当前我逐个过滤模型”是什么意思?我可以只过滤“ABC”或“DEF”所以我理解的是,如果您输入
“ABC”,您需要一个文本字段
它应该向您显示匹配的记录,如果您输入带有空格的“ABC DEF”它应该向您显示两条与其中任何一条匹配的记录?如果正确,您需要添加与您的
搜索模型
视图
和控制器
操作
相关的代码,抱歉更新太晚。我使用Gii生成积垢。我想我不需要添加代码:)我知道,但是为了建议更新,我不会编写所有的代码:),所以最好您添加相关的代码,我会在需要的地方相应地更新它,这样您就可以替换您端的代码并测试它是否正确,所以请添加控制器操作和
搜索()
SearchModel
@SaoHo我更新了答案有一个额外的检查第二个检查可以替换为第一个检查
如果($this->modeler!==null&&$this->modeler!==''){
那么我们可以将行移动到
$query->和filterwhere(['IN',modeler',$this->searchQuery])
在它里面。查看更新的代码。是的,我找到了:)谢谢,顺便说一下,我尝试过过滤1000个建模器,它返回错误,URL长度超过了容量限制。你知道我是否可以通过增加限制来修复它吗?你在控制台中遇到了针对ajax请求的错误吗Apache服务器在URL中仅支持4000个字符。如果我过滤了很多值,它会返回这个错误。我可以使用“POST”而不是“GET”方法来搜索模型吗?如果不可以,那就没问题了:)可以,但是你需要在控制器操作中更改queryParams以POST,并更改pjax的选项。请参阅此POST@SaoHo