【问题标题】:How can I filter conditionally grouped data in Yii2 GridView如何在 Yii2 GridView 中过滤条件分组数据
【发布时间】:2017-09-03 07:19:14
【问题描述】:

我有一个三列的表,分别是研究生id(grad_id)、资格和导师。任务是找出每个主管有多少学生获得不同的资格(博士、硕士、PGD、其他和总计)。问题是,在生成表格视图后,我无法过滤出主管的姓名,以查看他/她在各种资格类别中监督了多少学生。

我在视图中的 GridView 如下所示:

GridView::widget([
    'dataProvider' => $sup,
     'filterModel' => $searchModel,
       'columns' => [
 ['class' => 'yii\grid\SerialColumn'],
        'supervisor',
        'total',
        'phd',
        'masters',
        'pgd',
        'other',
    ],
]) 

通过以上,我能够生成表格。但是过滤器不会改变表格的内容,即使页面被刷新并且页面网址更改为(当我搜索 david 时):.../index.php?SupervisionSearch%5Bsupervisor%5D=david&SupervisionSearch%5Btotal%5D=&SupervisionSearch%5Bphd%5D=&SupervisionSearch%5Bmasters%5D=&SupervisionSearch%5Bpgd%5D=&r=student%2Fgrad-admissions%2Fsupervision

在我尝试过的 SupervisionSearch 类中:

public $supervisor;
public $phd;
public $masters;
public $pgd;
public $other;
public $total;

public function rules()
    {
        return [
            [['supervisor','phd', 'masters', 'pgd', 'other', 'total'], 'safe'],
            [['phd', 'masters', 'pgd', 'other', 'total'], 'number'],
            [['supervisor'], 'string'],
        ];
    }


  public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }


    public function search($params)
    {
$query = (new \yii\db\Query())
->select(["supervisor, sum(qualification = 'PhD') as phd", "sum(qualification = 'Masters') as masters", "sum(qualification = 'PGD') as pgd", "sum(qualification <> 'PhD' and qualification <> 'Masters' and qualification <> 'PGD')as other", "count(grad_id) as total"])
-> from('grad_students') 
-> where("supervisor <> ''")
-> orderBy('total desc')
-> groupBy('supervisor');

  $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;
        }

    $query->andFilterWhere(['like', 'supervisor', $this->supervisor]); 
   return $dataProvider;
    }

我需要帮助来获取过滤器以搜索特定主管姓名并显示他们在每个资格类别中监督的学生人数。提前致谢。

【问题讨论】:

    标签: php gridview yii2


    【解决方案1】:

    您的搜索功能 你可以用andFilterWhere 代替where

    public function search($params)
    {
    $query = (new \yii\db\Query())
    ->select(["supervisor, sum(qualification = 'PhD') as phd", 
      "sum(qualification = 'Masters') as masters",
      "sum(qualification = 'PGD') as pgd", 
         "sum(qualification <> 'PhD' 
            and qualification <> 'Masters' 
            and qualification <> 'PGD') as other", "count(grad_id) as total"])
    -> from('grad_students') 
    ->andFilterWhere(['like', 'supervisor', $this->supervisor])
    -> orderBy('total desc')
    -> groupBy('supervisor');
    .....
    

    你应该删除模型中列的声明..你应该只声明计算的列别名所以尝试评论public $supervisor;

    否则你的重新声明隐藏(重新定义)原始值并且不起作用

    //public $supervisor;
    public $phd;
    public $masters;
    public $pgd;
    public $other;
    public $total;
    

    【讨论】:

    • 谢谢 scaisEdge,我尝试按照建议使用andFilterWhere 而不是where,但过滤器仍然不起作用。
    • 答案已更新 .. 尝试评论 //public $supervisor;在您的搜索模型中
    • 再次感谢,我评论了public $supervisor;,但还是不行。但是,我尝试了一种解决方法,我将在下面发布作为答案。
    【解决方案2】:

    我通过一种变通方法得到了解决方案。我认为这个问题与原始问题中没有主键有关。我现在所做的,我首先在数据库中创建了一个视图,该视图也没有主键。然后我使用视图(而不是原始表)生成带有 GII 的模型。接下来,我在模型中放置了一个 primaryKey 函数,然后使用 GII CRUD 生成所需的搜索模型,其搜索过滤器现在运行良好。 这是我用来生成视图的代码(使用 mysql 使用 phpmyadmin):

    create view supervisor_count as select supervisor, sum(qualification = 'PhD') as phd, sum(qualification = 'Masters') as masters, sum(qualification = 'PGD') as pgd, sum(qualification <> 'PhD' and qualification <> 'Masters' and qualification <> 'PGD')as other, count(grad_id) as total from  grad_students where supervisor <> '' group by supervisor order by count(grad_id) desc
    

    这是我必须包含在 SupervisorCount 模型中以获取主键的代码:

    public static function primaryKey(){
    return 'supervisor';
    }
    

    GII CRUD 无法在没有主键的情况下运行。所以我在模型中使用了上面的primaryKey函数。但是在生成CRUD的时候,一开始,表/index.php?r=student%2Fsupervisor-count%2Findex的链接不起作用,抛出错误 Getting unknown property: app\modules\student\models\SupervisorCount::p。我通过在 Gii 上重新运行模型 SupervisorCount 生成器解决了这个问题,它删除了我放入模型中的 primaryKey 函数。此后,链接正常工作。使用生成的SupervisorCountSearch 模型的 GridView 现在有一个过滤器,该过滤器适用于每一列(主管、博士、硕士、Pgd、其他、总计)。

    但是,我仍然想知道是否有更好的解决方案,或者使用原始表gradstudents 作为模型而不是mysql 生成的supervisor_count 视图的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 2017-01-29
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多