2013-09-07 4 views
0

У меня есть стол с 700 000 строк.Запросы YII не работают

Profile::model()->findAll("country='US'") 

Я использовал это, чтобы найти все строки, в которых есть «США» в качестве страны. Но выполнение прекратилось, и я не получил никакого результата. Но затем я добавил лимит, как ниже

Profile::model()->findAll("country='US' limit 10000") 

тогда это сработало.

Почему выполнение прекращено? Пожалуйста, помогите мне. Я новичок в YII.

+2

Потому что было так много записей, что у вас закончилась память? В любом случае этот вопрос бессмыслен без дополнительной информации, поскольку мы просто будем гадать. Поместите приложение в режим отладки и получите его. – Jon

+0

нужна дополнительная информация? '$ criteria = новый CDbCriteria(); $ criteria-> addCondition ('t.country =: country'); $ criteria-> params [': country'] = 'US'; $ dataProvider = новый CActiveDataProvider ('Профиль', массив ('критерии' => $ критерии)); использовал это .. тогда он работает – Akhil5

+0

Сообщения об ошибках из журналов сервера будут хорошим началом. Вы положили приложение в режим отладки? – Jon

ответ

2

Если вы используете findAll, тогда все записи будут возвращены без каких-либо ограничений. Однако CActiveDataProvider автоматически выводит на экран результаты, если вы не говорите об этом иначе. Как упоминалось в комментариях, вы, вероятно, исчерпаете память при использовании findAll. Использование лимита или разбиения на страницы (которое автоматически применяет предел) снижает количество возвращаемых строк до того, что может обрабатывать ваше приложение.

Я рекомендую использовать CDataProviderIterator для получения большого количества активных записей. Попробуйте следующий пример кода.

$criteria = new CDbCriteria; 
$criteria->compare('country','US'); 

$Profiles = CDataProviderIterator(
    new CActiveDataProvider(
    'Profile', 
     array('criteria'=>$criteria) 
    ), 
    10000 
); 

foreach ($Profiles as $Profile) { 
    //do whatever 
} 

Используя итератор, Yii будет автоматически получать только 10000 записей (число вы говорите, работали без запуска из памяти) в то время, а затем удалить их из памяти прежде, чем захватить следующую страницу. Удобно, что все записи можно получить с помощью цикла foreach без дополнительной работы.

Измените значение 10000 по мере необходимости для достижения желаемых результатов. Кроме того, убедитесь, что вы отслеживаете журналы ошибок, чтобы идентифицировать нехватку памяти и другие ошибки.

Смежные вопросы