Yii1 - ограничение CDataProviderIterator не работает - PullRequest
0 голосов
/ 27 июня 2018

Я использую 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);

Что, похоже, не так?

1 Ответ

0 голосов
/ 27 июня 2018

Вы не можете отключить нумерацию страниц и использовать 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 не меньше, чем фактическое количество записей. Вы можете запросить базу данных для расчета этого значения.

...