如何让Yii2 GridView列在两个排序顺序的末尾放置NULL值?

时间:2017-09-27 11:58:39

标签: gridview yii2 kartik-v

我有一列数据有一些数值但偶尔会有NULL值,例如:

Name    Algebra   Band  Chemistry
Abel     3         6        2
Baker    5         NULL     4
Charlie  NULL      2        NULL
Delta    4         NULL     NULL

是否可以创建一个排序对象,以便在Score的两个方向上,NULL值总是在结尾?也就是说,

Name    Algebra [asc]  Band     Chemistry
Abel     3              6        2
Delta    4              NULL     NULL
Baker    5              NULL     4
Charlie  NULL           2        NULL

Name    Algebra [desc]  Band     Chemistry
Baker    5              NULL     4
Delta    4              NULL     NULL
Abel     3              6        2
Charlie  NULL           2        NULL
编辑:我应该在这里添加一个澄清 - 我使用ArrayDataProvider因为这是一个汇总表,所以我不能做任何在数据库端的事情 - 数据已经加载到一个本地数组,没有更多的数据库查询。

EDIT2:我已经收到了一些代码的请求,还有一些关于我正在使用的结构的请求。所以,我已经编辑了上面的例子,以便更接近我的实际情况。源数据看起来像这样:

[MySQL table and Yii model "Scores"]
Name     Class         Score
Abel     Algebra        3
Abel     Band           6
Abel     Chemistry      2
Baker    Algebra        5
Baker    Chemistry      4
Charlie  Band           2
Delta    Algebra        4

以下是代码的相关部分:

  $data = [];
  $items = Scores::find()->all();
  foreach ($items as $item) {
    $data[$item->name]['Name'] = $item->name;
    $data[$item->name][$item->class] = $item->score;
  }
  $arrayData = ArrayHelper::toArray($data);
  $arrayDataProviderInit = [
    'allModels' => $arrayData,
    'pagination' => [
      'pageSize' => 0,
    ],
    'sort' => [
      'attributes' => [
        'Name',
        // WHAT GOES HERE????
      ],
    ],
  ];
  $arrayDataProvider = new ArrayDataProvider($arrayDataProviderInit);
  $gridViewInit = [
    'dataProvider' => $arrayDataProvider,
    'formatter' => ['class' => 'yii\i18n\Formatter','nullDisplay' => 'NULL'],
    'columns' => [
        'Name',
        'Algebra',
        'Band',
        'Chemistry',
    ],
  ];
  echo GridView::widget($gridViewInit);

2 个答案:

答案 0 :(得分:0)

您可以通过在实际排序之前添加165. sys.path.insert(0, "pysam") 166. import version 167.version = version.__version__ 表达式来重新定义特定属性的排序规则 这是ActiveDataProvider的排序对象的用例

IS NULL

基本上每次按分数排序时,都会生成类似

的表达式
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);
    $dataProvider->sort->attributes = ArrayHelper::merge($dataProvider->sort->attributes, [
        'score' => [
            'asc'  => [
                'IS NULL ' . static::tableName().'score' => SORT_DESC,
                static::tableName(). 'score '=> SORT_ASC
            ],
            'desc' => [
                'IS NULL ' . static::tableName().'score' => SORT_DESC,
                static::tableName(). 'score '=> SORT_DESC
            ],
        ],
    ]);

确保首先按值是否为空进行排序,然后按实际值排序

以解决您的特定用例:

如果使用ORDER BY IS NULL score DESC, score ASC --or ORDER BY IS NULL score DESC, score DESC 基本上可以使用相同的原则,只需要在数据数组中添加另一个属性,并使用它来定义排序规则

ArrayDataProvider

答案 1 :(得分:0)

设置排序属性,在defaultOrder中只使用属性名称,例如:

   defaultOrder => ['score' => SORT_ASC],

您不应按默认顺序传递db表达式。

相关问题