Yii2 gridview排序自定义列

时间:2018-04-05 11:44:39

标签: php gridview yii2

我的项目中有一个民意调查。在网格中我显示了计数。

echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    [
        'label' =>"Constituency",
        'attribute' => 'constituency',
        'value'=>function($data){
            return $data["constituency"];
        }
    ],
    [
        'class' => 'yii\grid\DataColumn',
        'label' =>"Count",
        'attribute' => 'count',
       'value'=>function($data){
            return $data->getCount($data["constituency"]);
        },
        'enableSorting'=>TRUE ,

    ],

],      

我的模特
为得到计数

    public static  function  getCount($constituency){
    $cat = Polls::find()->where(['poll_place'=>$constituency])->count();
    // $cat = ArrayHelper::map($cat, 'id', 'name');
    return $cat;
}

计数列是自定义列 任何人都可以帮助对该列进行排序 我尝试过Thisthis 两者都失败了,因为我的计数属性不在我的数据库中 显示以下错误
Database Error

1 个答案:

答案 0 :(得分:0)

排序是在SQL级别完成的,你不能盲目地允许对虚拟属性进行排序,你需要调整你的查询来处理这样的排序。

首先,您需要在两个模型之间添加适当的relation。在Constituency模型中添加如下内容:

public function getPools()
{
    return $this->hasMany(Pools::className(), ['pool_place' => 'constituency']);
}

然后在查询中加入两个表并启用分组,这样您就可以为每个count计算Constituency

$query = Constituency::find()->joinWith('pools')->groupBy('constituency');

然后配置排序:

$sort = new Sort([
    'attributes' => [
        'constituency',
        'count' => [
            'asc' => 'COUNT(pools.poll_place) ASC',
            'desc' => 'COUNT(pools.poll_place) DESC',
        ],
    ],
]);

您还可以在count中创建Constituency属性,并在查询中添加->addSelect(['count' => Expression('COUNT(pools.poll_place)')]),以避免对每个Constituency的民意调查计数进行过多查询。