Yii1-CDataProviderIterator限制不起作用

时间:2018-06-27 18:03:01

标签: yii yii1.x

我正在使用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);

怎么了?

1 个答案:

答案 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不低于实际记录数。您可能要查询数据库以计算该值。