【问题标题】:Yii1 - CDataProviderIterator limit doesn't workYii1 - CDataProviderIterator 限制不起作用
【发布时间】:2018-06-27 18:03:01
【问题描述】:

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

似乎出了什么问题?

【问题讨论】:

    标签: yii yii1.x


    【解决方案1】:

    您不能同时禁用分页和使用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 不低于实际记录数。您可能需要查询数据库来计算此值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-04
      • 2011-02-10
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2018-09-14
      • 2013-02-07
      相关资源
      最近更新 更多