Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)相关的知识,希望对你有一定的参考价值。

我的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   

我有这样的网格视图。现在,只能逐个过滤建模器。我可以使用多行搜索框并只需粘贴“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",它应该显示2条匹配其中任何一条的记录。

所以,首先,在您的搜索模型添加之上

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"列类型中观察它。

以上是关于Yii2 gridview过滤来自多个值的列表(不是下拉列表过滤器)的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 GridView显示来自多个表的数据

不加载kartik 的select2 作为GridView 中的过滤器。 Yii2

Yii2 GridView 按年份过滤日期

Yii2过滤网格视图,带有多个$ _GET参数

Yii2:在 GridView 和 DetailView 中删除空值的“(未设置)”

Yii2 GridView Triger仅在点击时过滤