#php #laravel #laravel-8 #maatwebsite-excel
Вопрос:
У меня есть страница, которая позволяет пользователю выбрать сотрудника и диапазон дат(от и до). Затем они могут фильтровать записи на основе этого. Я хочу иметь возможность экспортировать данные в формат Excel, но когда я нажимаю «Экспорт», он загружает пустую электронную таблицу. Может ли кто-нибудь, пожалуйста, помочь мне найти мою проблему здесь.
Контроллер:
public function exportvehicles(Request $request) { $startDate = $request-gt;startDate; $endDate = $request-gt;endDate; return Excel::download(new ExportV($startDate, $endDate), 'excelname.xlsx'); }
Модель:
class ExportV implements FromQuery { /** * @return IlluminateSupportCollection */ use Exportable; protected $startDate; protected $endDate; function __construct($startDate,$endDate) { $this-gt;startDate = $startDate; $this-gt;endDate = $endDate; } public function query() { $startDate = request()-gt;input('startDate', '2021-01-01'); $endDate = request()-gt;input('endDate', '2021-12-12'); $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id') -gt;join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key') -gt;when(request()-gt;input('smsstaff_key'), function ($query) { $query-gt;where('smsstaff.smsstaff_key', request()-gt;input('smsstaff_key')); }) -gt;whereDate('log_dt', 'gt;=', $startDate) -gt;whereDate('log_dt', 'lt;=', $endDate) -gt;get(); return $data; } }
Вид:
lt;labelgt;Pick a staff memberlt;/labelgt; lt;select name="smsstaff_key" id="smsstaff_key"gt; lt;optiongt;----------------Select-----------------lt;/optiongt; @foreach ($staff as $staffMember) lt;option value="{{$staffMember-gt;smsstaff_key}}" {{request()-gt;input('smsstaff_key') === $staffMember-gt;smsstaff_key ? 'selected="selected"' : ''}}gt;{{$staffMember-gt;name}}lt;/optiongt; @endforeach lt;/selectgt; lt;button class="btn btn-primary"gt;Filter by selected staff memberlt;/buttongt; lt;/divgt; lt;div style="margin-left: 100px;"gt; lt;labelgt;From:lt;/labelgt; lt;input type="date" class="form-control" name="startDate" value="{{ $startDate }}"gt; lt;/divgt; lt;div style="margin-left: 150px;"gt; lt;labelgt;To:lt;/labelgt; lt;input style="width: 14em" type="date" class="form-control" name="endDate" value="{{ $endDate }}"gt; lt;/divgt; lt;a href="{{"/users/export/"}}" target="_blank" class="btn btn-primary"gt;Export to Excellt;/agt;
Маршрут:
Route::get('users/export/', 'AppHttpControllersAdminReportController@exportvehicles');
Комментарии:
1. если вы выполняете toSql в своем запросе, получаете ли вы результаты из своей базы данных?
2. @Thomas Хорошо, я удалил
get()
и экспортировал, но он экспортирует все записи. Есть ли способ заставить его экспортировать только отфильтрованные?3. Попробуйте отправить свой ввод в виде формы. Фильтрация не работает, потому что вы отправляете входные данные в приложение
4. @ManojKiranAppathurai Как бы я это сделал?
5. можете ли вы опубликовать код маршрута для операции экспорта ?
Ответ №1:
Когда вам нужно отправить значения на сервер, вам нужно отправить их в виде формы.
//web.php Route::post('users/export/', 'AppHttpControllersAdminReportController@exportvehicles')-gt;name('exportVehiclesToExcel');
Вид:
lt;form action="{{route('exportVehiclesToExcel')}}" method="POST"gt; lt;labelgt;Pick a staff memberlt;/labelgt; lt;select name="smsstaff_key" id="smsstaff_key"gt; lt;optiongt;----------------Select-----------------lt;/optiongt; @foreach ($staff as $staffMember) lt;option value="{{$staffMember-gt;smsstaff_key}}" {{request()-gt;input('smsstaff_key') === $staffMember-gt;smsstaff_key ? 'selected="selected"' : ''}}gt;{{$staffMember-gt;name}}lt;/optiongt; @endforeach lt;/selectgt; lt;button class="btn btn-primary"gt;Filter by selected staff memberlt;/buttongt; lt;/divgt; lt;div style="margin-left: 100px;"gt; lt;labelgt;From:lt;/labelgt; lt;input type="date" class="form-control" name="startDate" value="{{ $startDate }}"gt; lt;/divgt; lt;div style="margin-left: 150px;"gt; lt;labelgt;To:lt;/labelgt; lt;input style="width: 14em" type="date" class="form-control" name="endDate" value="{{ $endDate }}"gt; lt;/divgt; lt;button type="submit"gt;Export to Excellt;/buttongt; lt;/formgt;
Контроллер:
public function exportvehicles(Request $request) { $startDate = $request-gt;startDate; $endDate = $request-gt;endDate; $smsStaffKey = $request-gt;smsstaff_key return Excel::download(new ExportV($startDate, $endDate, $smsStaffKey), 'excelname.xlsx'); }
Класс экспорта Excel
class ExportV implements FromQuery { use Exportable; public $startDate; public $endDate; public $smsStaffKey; function __construct($startDate, $endDate, $smsStaffKey = null) { $this-gt;startDate = $startDate; $this-gt;endDate = $endDate; $this-gt;smsStaffKey = $smsStaffKey; } public function query() { $startDate = $this-gt;startDate; $endDate = $this-gt;endDate; $data = VehicleLog::join('vehicle', 'vehicleslog.vehicle_id', '=', 'vehicle.id') -gt;join('smsstaff', 'vehicleslog.smsstaff_key', '=', 'smsstaff.smsstaff_key') -gt;when($this-gt;smsStaffKey, function ($query) { $query-gt;where('smsstaff.smsstaff_key', $this-gt;smsStaffKey); }) -gt;whereDate('log_dt', 'gt;=', $startDate) -gt;whereDate('log_dt', 'lt;=', $endDate); return $data; } }
Прокомментируйте, если возникнут какие-либо проблемы
Комментарии:
1. там написано
The POST method is not supported for this route. Supported methods: GET, HEAD.
. Есть идеи, почему?2. обновил свой код в маршрутах