You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 02:26:02