Yii Dataprovider日期排序

时间:2014-10-13 01:58:18

标签: php sorting gridview yii2 dataprovider

我有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中的方法。这里有什么想法?

2 个答案:

答案 0 :(得分:3)

如果你有一个数组数据提供者,你当然不能使用数据库的排序。

使用Yii

的解决方案

要允许按某种表达式排序,您必须事先计算该值,并配置属性的排序以使用计算值而不是原始值:

// 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的解决方案

如果需要自定义比较功能,则必须扩展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',
        ]
    ]);