0

我正在使用 Yii 的 Dataprovider 根据“点”列输出一堆用户;

它现在工作正常,但我必须添加一个功能,所以如果用户在线,他可以获得额外的 300 分。

假设 Jack 有 100 分,Richmond 有 300 分,但是 Jack 在线,所以 Jack 的排名应该比 Richmond 高。

这是我现在的解决方案:

$user=new Rank('search');
$user->unsetAttributes();
$user->category_id = $cid; 
$dataProvider = $user->search();
$iterator = new CDataProviderIterator($dataProvider);
foreach($iterator as $data) {

//check if online ,update points

}

但是,这个 CDataProviderIterator 似乎将我的分页直接更改为最后一页,我什至不能再切换页面了。我应该怎么办?

非常感谢!


这是列表视图:

$this->widget('zii.widgets.CListView', array(
             'id'=>'userslist',
             'dataProvider'=>$dataProvider,
             'itemView'=>'_find',
         'ajaxUpdate'=>false,
             'template'=>'{items}<div class="clear"></div><div style="margin-right:10px;"><br /><br />{pager}</div>',
             'pagerCssClass'=>'right',
'sortableAttributes'=>array(
      //  'create_time'=>'Time',
    ), 
));

更新了 Rank.php 模型中的代码

$criteria->with = array('user');
$criteria->select = '*, (IF(user.lastaction > CURRENT_TIMESTAMP() - 1800, points+300, points)) as real_points';
$criteria->order = 'real_points DESC';

但是,它给我带来了错误:

Active record "Rank" is trying to select an invalid column "(IF(user.lastaction > CURRENT_TIMESTAMP() - 1800". Note, the column must exist in the table or be an expression with alias.
4

1 回答 1

1

CDataProviderIterator 迭代每个 dataprovider 值,并在最后停止。我对这些类一无所知,但认为原因在于某些内部迭代器,它在 foreach 之后的 dataprovider 末尾停止。当您不需要加载所有数据(对于大量数据)但需要处理每一行时,使用迭代器。

要解决您的问题,只需在您的视图“_find”中处理数据。如果在线,则在此处添加积分。

或者,如果您只想将此逻辑放在模型中(遵循 MVC :)),请将方法添加到您的模型中:

public function getRealPoints() {
    return ($this->online) ? ($this->points + 300) : $this->points;
}

并且可以$user->realPoints根据用户在线状态来获取积分

更新:要按“realPoints”排序您的列表,您需要在 SQL 中获取它。所以使用你的代码:

$user=new Rank('search');
$user->unsetAttributes();
$user->category_id = $cid; 
$dataProvider = $user->search();

并修改$user->search()功能,添加:

$criteria->select = '*, (IF(online='1', points+300, points)) as real_points';
$criteria->order = 'real_points DESC';

whereonlinepoints- 你的表格列。

于 2013-10-09T07:30:32.857 回答