我正在使用criteria
和CActiveDataProvider
进行查询,然后我想使用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);
怎么了?
答案 0 :(得分:0)
您不能禁用分页并同时使用CDataProviderIterator
。如果您查看CDataProviderIterator
的来源,您会发现它always use pagination。这就是此类的目的-它使用分页来避免同时将数百万条记录加载到内存中。如果您的限制较低,并且将所有数据加载到内存中不会超过某些内存限制,则可能根本不需要使用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
不低于实际记录数。您可能要查询数据库以计算该值。