Laravel> Красноречивая страстная нагрузка в партиях - PullRequest
0 голосов
/ 30 апреля 2018

Мне нужно получить полмиллиона строк из базы данных с помощью Laravel и экспортировать их в файл Excel. Проблема в том, что ресурс, который я экспортирую, имеет довольно много соединений, и когда я его экспортирую вот так (псевдокод)

 foreach( myResources as resource ) {
   convertToExcelRow(resource);
   convertToAnotherExcelRow(resource->joinedTable);
 }

Laravel создает полмиллиона запросов + еще один, чтобы сделать объединения.

Теперь, для большинства ситуаций, я мог бы использовать энергичную загрузку, которая загрузит все в одном запросе (намного быстрее), но для таких больших запросов laravel вызовет ошибку MySQL (плюс это очень медленно), потому что список строк идентификаторы, которые входят в WHERE id IN (сотни тысяч идентификаторов)

Есть ли у Laravel способ загружать пакеты? Например, разбейте список из 100 000 идентификаторов на 10 запросов, каждый из которых содержит 10 000 идентификаторов или что-то подобное.

1 Ответ

0 голосов
/ 01 мая 2018

Подумайте об использовании метода chunk, чтобы разбить задачу на управляемые части, например:

Resource::with(['relationship1','relationship2'])->chunk(500, function($resources) {
    $resources->each(function($resource) {
        $this->convertToExcelRow($resource);
        $this->convertToAnotherExcelRow($resource->joinedTable);
    });
});

Примечание:

Поэкспериментируйте с размерами чанка (500 - только пример). В этом случае вы должны получить 2 запроса на каждые 500 строк в вашей таблице. Если вы выберете 5000, ваш запрос может уменьшиться в 10 раз, но время загрузки может не увеличиться из-за увеличения количества запрашиваемых объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...