我的项目中有一个民意调查。在网格中我显示了计数。
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;
}
计数列是自定义列
任何人都可以帮助对该列进行排序
我尝试过This和this
两者都失败了,因为我的计数属性不在我的数据库中
显示以下错误
答案 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
的民意调查计数进行过多查询。