我有一列数据有一些数值但偶尔会有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);
答案 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表达式。