Я делаю базовое приложение базы данных, которое позволяет пользователям отправлять параметры поиска через форму и отображать результаты в виде. Я создаю запрос из модели Eloquent, разбиваю на страницы, а затем отправляю результаты в представление.
Я хотел бы разместить ссылку на представление результатов, которая позволяет пользователям загружать результаты своего запроса в CSV-файл, но передавать данные в потоковом режиме, а не создавать файл, а затем обслуживать его. Моя проблема в том, что я не знаю, как передать запрос со страницы результатов по маршруту на другой контроллер, который обрабатывает загрузку.
Информация, которую я нашел об отправке данных на маршрут, включает в себя отправку параметров для URL, который, я не уверен, мне помогает.
Я думал, что смогу кешировать результаты, отправив данные из контроллера, обрабатывающего запрос, в контроллер, обрабатывающий загрузку, перед отправкой его в представление, но я не уверен, как это сделать, или Laravel предоставляет лучший способ сделать то, что Я хочу.
Вот как я делаю это с Laravel 5.6 в view
когда пользователь хочет скачать csv
файл. Обратите внимание, что вы должны пройти Builder
объект вместо LengthAwarePaginator
, Также обратите внимание на send()
метод после streamDownload
который я должен был понять сам.
/** @var \Illuminate\Database\Query\Builder $results */
$callback = function () use ($results) {
$file = fopen('php://output', 'w');
// Set column names from the first result keys
fputcsv($file, array_keys((array)$results->first()));
// Get results in chunks to stream large downloads
$results->chunk(1000,
function ($rows) use ($file) {
foreach ($rows as $row) {
fputcsv($file, (array)$row);
}
}
);
fclose($file);
};
$headers = [
'Content-Type' => 'text/csv',
];
return response()->streamDownload($callback, 'filename.csv', $headers)->send();
Других решений пока нет …