Как передавать данные загрузки из текущего представления в Laravel 5.7

Я делаю базовое приложение базы данных, которое позволяет пользователям отправлять параметры поиска через форму и отображать результаты в представлении. Я создаю запрос из модели Eloquent, разбиваю на страницы и затем отправляю результаты в представление.

Я хотел бы разместить ссылку в представлении результатов, которая позволяет пользователям загружать результаты своего запроса в CSV-файл, но передавать данные, а не создавать файл, а затем обслуживать его. Моя проблема в том, что я не знаю, как передать запрос со страницы результатов через маршрут к другому контроллеру, который обрабатывает загрузку.

Информация, которую я нашел об отправке данных на маршрут, включает отправку параметров для URL-адреса, который, я не уверен, мне помогает.

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


person CuriousTim    schedule 07.11.2018    source источник
comment
Используете ли вы определенную библиотеку Excel, например maatwebsite/excel? У них часто есть метод загрузки CSV-файлов из памяти. В противном случае есть response()->streamDownload(), если вы сами генерируете его на лету.   -  person Travis Britz    schedule 08.11.2018
comment
Я не использую никакие библиотеки. Я знаю о response()->streamDownload(), но не знаю, как это сделать из представления.   -  person CuriousTim    schedule 11.11.2018


Ответы (1)


Вот как я это делаю с 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();
person dgpro    schedule 07.01.2019