2015-02-24 1 views
1

Вслед за этим вопрос: How to chunk results from a custom query in LaravelКак кусок результатов из пользовательского запроса с Laravel 5

Я стараюсь

DB::connection('mgnt')->select($query)->chunk(200, function($orders) { 
    foreach ($orders as $order) { 

    //a bunch of code... 

    } 
}); 

Но я получаю следующее сообщение об ошибке:

FatalErrorException in MigrationController.php line 98: 
Call to a member function chunk() on array 

ли отрывов возможно без наличия подходящей модели ОРВ? Я пытаюсь сделать так, что я получаю пустую страницу (не могу найти никаких ошибок в любом журнале), если запрос возвращает слишком много результатов.

Я думаю, что сейчас это максимум 50.000 результатов, которые я могу запросить сразу. Возможно, это связано с некоторыми ограничениями или ограничениями в Laravel?

ответ

2

Ну так как запрос будет просто возвращать массив объектов, которые вы можете просто использовать РНР array_chunk():

$result = DB::connection('mgnt')->select($query); 
foreach(array_chunk($result, 200) as $orders){ 
    foreach($orders as $order){ 
     // a bunch of code... 
    } 
} 

Вот что chunk() на красноречивый модели делает:

$results = $this->forPage($page = 1, $count)->get(); 

while (count($results) > 0) 
{ 
    // On each chunk result set, we will pass them to the callback and then let the 
    // developer take care of everything within the callback, which allows us to 
    // keep the memory low for spinning through large result sets for working. 
    call_user_func($callback, $results); 

    $page++; 

    $results = $this->forPage($page, $count)->get(); 
} 

Вы могли бы попробуйте сделать что-то подобное (хотя я думаю, что должно быть возможно запустить ваш запрос сразу, но я не могу помочь вам с этим ...)

  1. Добавить предел вашего запроса LIMIT 200
  2. Увеличьте смещение с каждым запросом запускается. Во-первых 0, второй 1 * 200, третий 2 * 200
  3. ли, что пока результат не будет возвращен пустой (например, с петлей в то время как выше)
+0

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

+0

А я вижу. Тогда почему бы не использовать модель Eloquent? Я не знаю, что ограничивает количество результатов. Это может быть время выполнения PHP или некоторые другие настройки на сервере веб-сервера или базы данных ... – lukasgeiter

+0

это сложный запрос ETL с подзапросами, переменными, вычислениями, около 60 строк SQL. Я тестировал его с разными клиентами MySQL, и результаты занимают 17 секунд и возвращают 250 тыс. Строк. – kritop

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