我有ArrayDataProvider,其字段类型为DateTime - birthdate。 我在视图部分使用dataprovider作为gridview。
由于出生日期包括分娩年份,分拣不按预期工作。 有没有办法以某种方式告诉排序机制不要计算年限,只按月和日排序?也许是自定义排序功能?
编辑:在C ++中可以传递比较功能的sort
。
编辑当前解决方案说明 我目前的解决方案是将出生年份列为阵列中的一个单独的领域,并将出生日期定为当年。现在日期来自同一年,排序工作。但出生年份的单独领域并不合适。我希望我能从一个日期对象中获取所有必要的数据。
这个独立的领域研磨我的齿轮。它并不完美。
修改 哦,还有它的Yii2
更新 还有一个PHP数组排序函数,它们采用比较回调 - 例如可以在像我这样的关联数组上使用的uasort:
uasort($persons, function($a, $b){
return strcasecmp( $b['date']->format('m-d'), $a['date']->format('m-d') );
});
现在我需要找到将它实现到ArrayDataProvider中的方法。这里有什么想法?
答案 0 :(得分:3)
如果你有一个数组数据提供者,你当然不能使用数据库的排序。
要允许按某种表达式排序,您必须事先计算该值,并配置属性的排序以使用计算值而不是原始值:
// assuming $data contains your data and 'birthdate' is the value you want to use for sorting
foreach($data as $key => $value) {
$data[$key]['sort_birthdate'] = date('m-d', strtotime($value['birthdate']));
}
$dataProvider = new \yii\data\ArrayDataProvider([
'allModels' => $data,
'sort' => [
'attributes' => [
'birthdate' => [
'asc' => [
'sort_birthdate' => SORT_ASC,
],
'desc' => [
'sort_birthdate' => SORT_DESC,
],
'label' => 'Date',
'default' => SORT_ASC
],
// list all other attributes here
],
]
]);
如果需要自定义比较功能,则必须扩展Yii类以支持此功能。
您可以创建一个自定义ArrayDataProvider
类,该类从Yii附带的类扩展并覆盖sortModels() - 方法。
答案 1 :(得分:1)
你应该尝试像
这样的东西use yii\db\Expression;
$dataProvider->setSort([
'attributes' => [
................................
'birthday' => [
'asc' => [
new Expression('DATE_FORMAT(birthday, "%m%d")') => SORT_ASC,
],
'desc' => [
new Expression('DATE_FORMAT(birthday, "%m%d")') => SORT_DESC,
],
'label' => 'Birthday',
'default' => SORT_ASC
],
................................
]
]);
我没试过这个。
可以肯定的是做这样的事情
$query->select([
new Expression('DATE_FORMAT(birthday, "%m%d") as show_date'),
.................................
]);
然后
/**
* Setup your sorting attributes
* Note: This is setup before the $this->load($params)
* statement below
*/
$dataProvider->setSort([
'attributes' => [
'id',
'show_date' => [
'asc' => [
'sort_date' => SORT_ASC,
],
'desc' => [
'sort_date' => SORT_DESC,
],
'label' => 'Date',
'default' => SORT_ASC
],
'price',
'gst',
'cost',
'quantity',
'profit',
]
]);