Laravel中Bootstrap Table筛选数据全量导出问题及解决需求
解决Bootstrap Table结合Laravel API的全量导出问题
在Laravel应用中使用Bootstrap Table开发数据导出功能时,若采用服务端分页模式,默认导出仅会获取当前页数据。即使配置了自定义日期筛选,导出PDF、Excel或CSV时仍只能得到第一页的10条数据,以下是实现筛选后全量导出的解决方案:
前端调整
Bootstrap Table在服务端分页模式下,导出请求默认沿用当前分页参数,需通过事件拦截修改导出请求,确保携带筛选参数并请求全量数据。
1. 表格事件配置
修改原有jQuery代码,添加export.bs.table事件拦截导出请求,手动拼接包含导出标识和筛选参数的API地址:
$(document).ready(function() { // 日期筛选逻辑 $('.filter_asset_by_date').on('change', function() { var startDate = $('#start_date').val(); var endDate = $('#completion_date').val(); $('#maintenancesReport').bootstrapTable('refresh', { query: { start_date: startDate, completion_date: endDate } }); }); // 重置筛选 $('#reset_filters').on('click', function() { $('#start_date').val(''); $('#completion_date').val(''); $('#maintenancesReport').bootstrapTable('refresh', { query: { start_date: '', completion_date: '' } }); }); // 拦截导出请求,传递全量数据参数 $('#maintenancesReport').on('export.bs.table', function(e, args) { // 获取当前筛选的日期参数 const startDate = $('#start_date').val(); const endDate = $('#completion_date').val(); // 拼接导出专用API地址,添加export标识和筛选参数 args.url = "{{ route('api.maintenances.index') }}?export=1&start_date=" + encodeURIComponent(startDate) + "&completion_date=" + encodeURIComponent(endDate); }); });
后端API修改
Laravel API需要识别导出请求,当收到export=1参数时,跳过分页逻辑,返回所有符合筛选条件的数据:
修改控制器的index方法:
public function index(Request $request) { $this->authorize('view', Asset::class); $maintenances = AssetMaintenance::select('asset_maintenances.*') ->with('asset', 'asset.model', 'asset.location', 'supplier', 'asset.company', 'admin'); // 应用日期筛选条件 if ($request->filled('start_date')) { $maintenances->whereDate('start_date', '>=', $request->input('start_date')); } if ($request->filled('completion_date')) { $maintenances->whereDate('completion_date', '<=', $request->input('completion_date')); } // 判断是否为导出请求 if ($request->has('export')) { // 导出时返回全量筛选后数据 $total = $maintenances->count(); $maintenances = $maintenances->get(); } else { // 普通分页请求逻辑 $offset = (($maintenances) && ($request->get('offset') > $maintenances->count())) ? $maintenances->count() : $request->get('offset', 0); // 限制每页数量不超过系统配置最大值 $limit = ($request->filled('limit') && config('app.max_results') >= $request->input('limit')) ? $request->input('limit') : config('app.max_results'); $total = $maintenances->count(); $maintenances = $maintenances->skip($offset)->take($limit)->get(); } return (new AssetMaintenancesTransformer())->transformAssetMaintenances($maintenances, $total); }
核心逻辑说明
- 前端通过
export.bs.table事件拦截导出操作,手动构造包含export=1标识和当前筛选参数的请求URL,确保导出请求能被后端识别。 - 后端根据
export参数区分普通分页请求和导出请求:导出请求直接返回所有符合筛选条件的数据,普通请求则保持原有分页逻辑。 - 该方案同时兼容日期筛选功能,确保导出数据与页面展示的筛选结果完全一致。
内容的提问来源于stack exchange,提问作者BIlal Ahmed
相关产品推荐
相关产品推荐

