php - ,DataProvider在每个结果中都更改列的属性

  显示原文与译文双语对照的内容
0 0

使用yii的Dataprovider来基于列"点"输出大量用户;

现在工作正常,但我必须添加一个特性,如果用户在线,他得到一个额外的300点。

假设杰克有 100点,Richmond有 300点,但是杰克在线,所以杰克应该比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似乎将我的分页直接更改为最后一页,而且我甚至不能再。 我该怎么做?

非常感谢!


下面是 listview:


$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.

时间: 原作者:

0 0

CDataProviderIterator迭代每个dataprovider值,并在结束处停止。 我不知道这个类,但是认为原因是在一些内部迭代器中,在foreach后面停止。 当你不需要加载所有数据( 对于大量数据),但需要处理每一行时,使用迭代器。

要解决你的问题,只需在视图"_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';

onlinepoints - 你的表列。

...