【问题标题】:Re-sorting a CActiveDataProvider重新排序 CActiveDataProvider
【发布时间】:2012-05-08 03:01:48
【问题描述】:

我正在寻找一种在 Yii 中重新排序 CActiveDataProvider 的方法。

目前我正在使用数据提供程序来获取已排序和分页的数据。

然后我使用 foreach 循环调整特定字段的数据,现在我需要根据新调整的数据重新排序。

我无法使用 afterFind 对模型中的数据进行排序,因为我需要查询另一个数据库 (MySQL) 来计算出一个计算值,而且它似乎不喜欢处理过程中的切换。

我不想使用 CArrayDataProvider,因为没有明显的方法可以对返回的数据进行分页,除非我在调整数据时将控件放入循环中,但是我不知道可以返回多少数据,比如说 200 条记录,但显示的唯一调整 20 条似乎违反直觉。

然后这一切都被推送到 CGridView 小部件。

所以现在我需要以升序重新调整下面的数组。

$dataProvider = new CActiveDataProvider( blah );

foreach ( $dataProvider->getData() as $data ) {
 $data->Score += SomeModel::model()->findByPk(1)->NewScore;
}

array(
'Score' => 7
),
array(
'Score' => 6
)

$this->render('blah', array('data' => $dataProvider);

【问题讨论】:

    标签: php sorting yii


    【解决方案1】:

    听起来您应该简单地实现一个您自己的新CDataProvider 来包装现有的CDataProvider。您将需要覆盖几个方法,但对于大多数方法,您可以简单地转发到包装的数据提供者。代码最终可能看起来像这样:

    $dataProvider = new CActiveDataProvider(...);
    $myProvider = new CustomDataProvider($dataProvider);
    
    // you could make CustomDataProvider work like this:
    $myProvider->dataMutator = function(&$row, $key) {
        $row->Score = SomeModel::model()->findByPk(1)->NewScore;
    };
    
    $this->render('blah', array('data' => $myProvider);
    

    CustomDataProvider::fetchData 可能如下所示:

    protected function fetchData()
    {
        $data = $this->wrappedProvider->fetchData();
        array_walk(&$data, $this->dataMutator);
        uasort($data, function($a, $b) { return $a->Score - $b->Score; });
        return $data;
    }
    

    我已经在这里对排序进行了硬连线——这适用于原型设计,但明确指定后处理排序并非易事,因为:

    • CDataProvider 公开了一个被忽略的 sort 属性。完全集成该属性要么是不平凡的工作(您必须编写尊重多个排序标准等的代码),要么在其基类上更改 CustomDataProvider.sortsort 相比的语义。 CDataProviderCSort 结婚,因此如果您想从 OO 角度寻求最干净的解决方案,最好从头开始实施 IDataProvider
    • 如果单个 'sortproperty is used, becausesort` 不能同时反映包装数据提供者将做什么以及“后处理”排序将做什么,那么CustomDataProvider 的用户将不直观时间;但是,以上两种情况都会影响最终结果。

    我建议你让原型工作,然后好好想想对象模型应该是什么。

    【讨论】:

    • 谢谢你,但是我不确定数据在什么时候被使用,或者我应该如何在我的自定义提供程序中实现它,以便它按分数排序。
    • @DamianCrawford:我修改了很多答案,看看它现在是否更有用。注意:现在覆盖 fetchData 而不是 getData
    • 嗨@Jon,很抱歉在不同的评论中发表评论。当没有分页时,我陷入了降序,其中数据以正确的降序排列。但是,一旦分页开始,数据就没有按正确的顺序排列。这是问题 - stackoverflow.com/questions/58560374/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2015-10-11
    相关资源
    最近更新 更多