Прохождение через большую таблицу с использованием Yii ActiveRecord - ошибки "недостаточно памяти"

У меня есть веб-сайт на Yii Framework, и я хочу найти в таблице подходящие слова.

Я продолжаю получать "out of memory" (это большой стол).

Я пытаюсь этот код, но он продолжает загружать страницу

$dataProvider = new CActiveDataProvider('Data');
$iterator = new CDataProviderIterator($dataProvider);
foreach($iterator as $data) {
    echo $data->name."\n";
}

Поэтому я пытаюсь этот код, но он продолжает ограничивать результат до 10:

$dataProvider = new CActiveDataProvider('Data');
$iterator = new CDataProviderIterator($dataProvider);
foreach($dataProvider as $data) {
    echo $data->name."\n";
}

и если я делаю это, я получаю сообщение "недостаточно памяти":

$dataProvider = new CActiveDataProvider('Data' array(
    'criteria'=>array(
        'order'=>'id DESC',
    ),
    'pagination' => false
));

foreach($dataProvider as $data) {
    echo $data->name."\n";
}

2 ответа

Неразумно использовать CActiveDataProvider для больших наборов данных. Особенно, если вы хотите выполнять над ними только фоновые задачи. Было бы рекомендовано использовать прямой SQL и идти оттуда.

Основываясь на комментариях к ответу CreatoR, вы пытаетесь найти множество случаев в большой таблице. В качестве примера:

$connection=Yii::app()->db;
$sql = "SELECT id FROM data WHERE field1 LIKE '%someValue%' OR field2 LIKE '%someValue%' OR field3 LIKE '%someValue%'";
$command=$connection->createCommand($sql);
$numberOfRestuls=$command->execute();
//if you also want to display the results :
$ids=$command->queryAll();
$criteria=new CDbCriteria;
$criteria->addInCondition('id',$ids,'OR');
$dataProvider = new CActiveDataProvider('Data', $criteria);
//etc

Я не знаю, зачем вам нужно загружать все результаты поиска на одной странице, но вы можете изменить количество элементов на странице, чтобы получить желаемое значение с помощью этого кода (и используя разбиение на страницы):

$dataProvider = new CActiveDataProvider('Data' array(
    'criteria'=>array(
        'order'=>'id DESC',
        'condition' => 'town LIKE :search_town AND FK_country > :country_id',
        'params' => array(':search_town' => $search_town.'%', ':country_id' => 10)
    ),
     'pagination' => array(
         "pageSize" => 100,
         //"currentPage" => 0, //using for pagination
     )
));
$iterator = new CDataProviderIterator($dataProvider);
foreach($iterator as $data) {
     echo $data->name."\n";
}

Здесь http://sonsonz.wordpress.com/2011/10/14/yii-examples-of-using-cdbcriteria/ больше примеров

Другие вопросы по тегам