Yii1 - CDataProvider迭代器限制不起作用



我正在使用criteriaCActiveDataProvider进行查询,然后我想使用CDataProviderIterator,但似乎CDataProviderIterator忽略了限制。

到目前为止的代码:

$criteria = new CDbCriteria();
$criteria->select    = "t.id";
$criteria->join      = 'LEFT JOIN purged_files ON t.id = purged_files.project_id';
$criteria->order     = "t.id asc";
$criteria->condition = " purged_files.id IS NULL AND `new_status_id` IN ('DELIVERED', 'PAID') AND `created` <= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 180 DAY)";
$criteria->limit     = 1;
$criteria->offset    = 0;
$criteria->together  = true;
$dataProvider = new CActiveDataProvider('Project', array(
'criteria'   => $criteria,
'pagination' => false
));
$iterator = new CDataProviderIterator($dataProvider);

似乎出了什么问题?

不能同时禁用分页和使用CDataProviderIterator。如果您查看CDataProviderIterator源,您会发现它始终使用分页。这就是此类的目的 - 它使用分页来避免同时将数百万条记录加载到内存中。如果限制较低,并且将所有数据加载到内存中不会超过某些内存限制,则可能根本不需要使用CDataProviderIterator- 可以直接从数据提供程序获取数据:

foreach ($dataProvider->getData() as $project) {
$project->doSomething();
}

或者根本不使用数据提供程序:

$models = Project::model()->findAll($criteria);

如果你真的需要CDataProviderIterator,你可以通过使用totalItemsCount属性来覆盖实际数量的记录来设置限制:

$dataProvider = new CActiveDataProvider('Project', array(
'criteria'   => $criteria,
'totalItemsCount' => 5000,
));

确保您的totalItemsCount不低于实际记录数。您可能需要查询数据库来计算此值。

最新更新