首先,我在这里使用了javascript示例,我掌握了基本示例并自行修改了。
https://datatables.net/examples/data_sources/server_side
我要处理几个问题,这些问题是:
这是我的dataTable脚本:
$('#invoice-history').DataTable({
processing: true,
serverSide: true,
searchDelay: 1000,
ajax: {
url: '/stock-sales/search',
type: 'POST',
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
},
columns: [
{ data: 'ss_id' },
{
render: function ( data, type, row, meta ) {
return row.patient_last_name + ', ' + row.patient_first_name;
}
},
{ data: 'grandtotal_current' },
{ data: 'created_at' },
{
render: function ( data, type, row, meta ) {
return '<a href="/reports/invoice/' + row.ss_id + '/print" target="_blank" class="btn btn-primary btn-xs btn-block"><i class="fa fa-print"></i> Print</a>';
}
},
{
render: function ( data, type, row, meta ) {
return '<a href="/stock-sales/return/' + row.ss_id + '" class="btn btn-danger btn-xs btn-block"><i class="fa fa-undo"></i> Return</a>';
}
}
],
columnDefs: [ {
targets: [ 4, 5 ],
orderable: false
} ],
language: {
emptyTable: '<center><span class="label label-danger">NO INVOICE RECORDS FOUND</span></center>',
zeroRecords: '<center><span class="label label-danger">NO MATCHING RECORDS FOUND</span></center>'
},
order: [[ 3, 'desc' ]]
});
在服务器端,我使用Laravel框架:
public function search(Request $request)
{
$transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id, $request->search['value']);
return array(
"draw" => 1,
"recordsTotal" => count($transactions),
"recordsFiltered" => count($transactions),
"data" => $transactions
);
}
我不想在过滤器之前获取原始记录总数,所以我将其设置为相同,我认为这与分页结果数据无关,因为我也尝试过硬编码更高的记录。 recordsTotal值。
编辑:
实际上是通过从ajax返回绘图插入器来使搜索重绘数据表
public function search(Request $request)
{
$transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id, $request->search['value']);
return array(
"draw" => $request->draw, //from fixed 1
"recordsTotal" => count($transactions),
"recordsFiltered" => count($transactions),
"data" => $transactions
);
}
答案 0 :(得分:1)
尝试在数据表初始化中使用“ pageLength”属性来指定每页的行数。
"pageLength": 10,
服务器端: 您需要使用ajax请求传递的'length'和'start'参数进行服务器端分页。看看数据表在服务器端处理中使用的所有parameters。
$limit = $request->length;
$start = $request->start;
因此,您可以将控制器方法微调为:
$transactions = StockSales::getAllByDepartment(Auth::user()->employee->department->id,
$request->search['value'])
->offset($start)
->limit($limit);
return array(
"draw" => $request->draw, //from fixed 1
"recordsTotal" => count($transactions),
"recordsFiltered" => count($transactions),
"data" => $transactions
);
答案 1 :(得分:0)
这里的问题是您由于https://datatables.net/examples/data_sources/server_side而误解了服务器端处理serverSide: true
启用服务器端处理后,DataTables执行的所有分页,搜索,排序操作都将传递到服务器,在该服务器上,SQL引擎(或类似引擎)可以对大型数据集执行这些操作(毕竟,这就是数据库引擎是专为!)。这样,每次绘制表格都会导致发出新的Ajax请求以获取所需的数据。
在您的情况下,您将在调用的ajax上返回所有数据,并认为datatable将处理分页并为您排序。那是错误的,您必须自己在名为pap的ajax上执行此操作
但是,100条记录并不大,您可以通过以下方式解决问题
serverSide: false
进行这样的更改,datatable将从ajax源加载所有数据并为您处理