Yii2- Select2 按钮作为网格视图过滤器不过滤

Posted

技术标签:

【中文标题】Yii2- Select2 按钮作为网格视图过滤器不过滤【英文标题】:Yii2- Select2 button as Grid view filter doesn't filter 【发布时间】:2020-04-17 07:28:22 【问题描述】:

我想在 Yii Grid 视图中使用 Select2 dr 作为过滤器,但它根本不过滤,只刷新页面。

我从 2 个表中获取数据——我只从账户中获取 user_id,从学分中获取其他所有数据。并且每个过滤器都有效,除了 And 'user_id' 一个。

<?php

 echo GridView::widget(
     [
         'dataProvider' => $dataProvider,
         'filterModel' => $searchModel,
         'columns' => [
             [
                 'attribute' => 'wp_id',
                 'value' => 'accounts.user_id',
                 'filter' => Select2::widget(
                     [
                         'model' => $searchModel,
                         'attribute' => 'wp_id',
                         'data' => ArrayHelper::map(Accounts::find()->all(), 'wp_id', 'user_id'),
                         'options' => ['placeholder' => ' --Filter by user id-- '],
                         'language' => 'en',
                         'pluginOptions' => [
                             'allowClear' => true,
                         ],
                     ]
                 ),
             ],
         ],
     ]
); ?> 

这是控制器中的操作。

<?php
 public function actionIndex()
    

        $searchModel = new CreditsSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
        ]);
     ?> 

这就是搜索模型方法

<?php   
public function search($params)
    
        $query = Credits::find()->with('accounts');

        $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(!empty($this->user_id)) 
            $query->andFilterWhere(['=', 'accounts.user_id', $this->user_id]);
        
        // grid filtering conditions
        $query->andFilterWhere([
            'user_id' => $this->user_id,
            'wp_id' => $this->wp_id,
            'credits_bought' => $this->credits_bought,
            'purchase_date' => $this->purchase_date,
            'id' => $this->id,
        ]);

        return $dataProvider;
    
 ?> 

提前致谢!

【问题讨论】:

哪个不工作?您已将 select2 过滤器字段配置为 wp_id 并且您正在询问过滤 user_id? ,请澄清,因为 gridview 列是 wp_id,它将被传递给搜索模型,wp_id 根据 ArrayHelper::map(Accounts::find()-&gt;all(), 'wp_id', 'user_id') 而不是 user_id 作为值传递,因为它显示为下拉列表的文本和不是价值。 实际上,user_id 仅显示为文本而 wp_id 用于值的信息帮助我解决了这个问题,现在一切正常。非常感谢,我看到这个问题很愚蠢,解决方案很容易找到,但我仍在学习如何准确地使用 Yii 框架及其组件。再次非常感谢您,祝您有美好的一天! 没问题,很高兴能帮上忙,每个人都需要时间来学习。我将其添加为答案,因此您可以在回来时接受它。 【参考方案1】:

因为您在GridView 过滤器下传递wp_id 并从Accounts 模型中选择wp_id 作为select2-dropdown 的值

ArrayHelper::map(Accounts::find()->all(), 'wp_id', 'user_id')

虽然使用 gridview 列属性 wp_id 并使用 select2 过滤同一列的 user_id 会让人感到困惑,但如果您想要这样做,您可能需要将上面的内容更改为

ArrayHelper::map(Accounts::find()->all(), 'user_id', 'wp_id')

【讨论】:

在上面的解决方案中,数据将被“wp_id”过滤,“wp_id”显示在下拉列表中。如何使“user_id”显示在下拉列表中,而数据由相同的“wp_id”过滤? @NixMan 你应该用代码发布一个单独的问题

以上是关于Yii2- Select2 按钮作为网格视图过滤器不过滤的主要内容,如果未能解决你的问题,请参考以下文章

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

Yii2:Gridview过滤器中的kartik\Select2下拉列表

Yii2网格视图使用ajax而不是Pjax进行过滤

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

如何将原始 SQL 转换为 Yii2,如查找查询

使用 Select2 在视图 Yii2 中调用函数