Yajra/Jquery datatable如何按条件排除记录,解决前端隐藏后分页异常
问题原因
- 你的
addColumn方法里的判断逻辑存在错误:$arr是包含两个数值的数组,PHP中直接将数组和数字0比较的结果永远为真,所以这个过滤条件完全不生效。 - 分页计数不一致的核心原因是:前端隐藏行仅做视觉上的隐藏,Datatables的分页统计是基于后端返回的总记录数计算的,后端返回的数据集本身包含了
total为0的记录,因此分页会统计全量数据。
解决方案
方案1:后端查询阶段过滤(推荐)
直接在数据源查询阶段就过滤掉不符合条件的记录,返回给前端的数据集本身只有符合要求的记录,分页计数天然正确,性能也最优。
如果使用的是Laravel Yajra Datatables组件,示例代码如下:
// 构造查询时直接计算total并过滤不符合条件的记录 $query = 你的模型类::selectRaw('*, ABS(fba_fee_count) + ABS(referral_fee_count) as total') ->whereRaw('ABS(fba_fee_count) + ABS(referral_fee_count) > 0'); // 传入Datatables处理,不需要再额外写addColumn计算total return datatables()->of($query) // 其他字段的处理逻辑 ->make(true);
方案2:前端分页场景临时修复
仅适用于前端分页(一次性拉取全量数据到前端做分页)的场景,服务端分页场景不适用
修改Datatables的绘制回调,自定义计数逻辑:
$('#你的表格ID').DataTable({ // 你原有其他配置保持不变 "createdRow": function( row, data, dataIndex ) { if ( data.total === 0 ) { $(row).addClass('hidden'); } }, "fnDrawCallback": function ( oSettings ) { // 计算可见行数量,重写统计文案 const visibleCount = $('tr:not(.hidden)', oSettings.nTable).length; $('#你的表格ID_info').html(`显示第 ${oSettings._iDisplayStart+1} 到 ${Math.min(oSettings._iDisplayEnd, visibleCount)} 条,共 ${visibleCount} 条记录`); // 调整分页总条数参数 oSettings._iRecordsTotal = visibleCount; oSettings._iRecordsDisplay = visibleCount; } });
内容的提问来源于stack exchange,提问作者Vince
相关产品推荐
相关产品推荐

