我正在使用yajra数据表作为服务器端数据表
我的控制器是这个
public static function alleventsData(Request $request)
{
$limit = intVal($request->input('length'));
$start = $request->input('start');
$meta = EventsRepository::showMeta();
$totalRecords = $meta[1][1]['Value'];
$offset = intVal($start);
$allEvents = EventsRepository::allEvents($offset, $limit);
return Datatables::collection($allEvents)
->addColumn(
'parent',
function ($allEvents) {
return $allEvents['category_name'];
}
)
->addColumn(
'venueName',
function ($allEvents) {
return $allEvents['venue_name'];
}
)
->addColumn(
'venueLocation',
function ($allEvents) {
return $allEvents['location'];
}
)
->addColumn(
'occurs_at',
function ($allEvents) {
return $allEvents['occurs_at'];
}
)
->addColumn(
'hot_popular_main',
function ($allEvents) {
return '<input type="checkbox" name="hot_popular_main" class= "updatePopertyEvent" attr="hot_popular_main" id="'.$allEvents['id'].'" value="'.$allEvents['hot_popular_main'].'" '.($allEvents['hot_popular_main']==1?'checked="checked"':'').'/>';
}
)
->addColumn(
'synchronize',
function ($allEvents) {
return '<button value="'.$allEvents['id'].'" class="btn btn-info synchronize" >Synchronize</button>';
}
)
->addColumn(
'status',
function ($allEvents) {
$status = $allEvents['status']==1?"Active":"Deactive";
return '<button value="'.$allEvents['id'].'" class="btn btn-info status" data-attr="'.$allEvents['status'].'">'.$status.'</button>';
}
)
->with(['recordsTotal'=>$totalRecords, 'recordsFiltered'=>$totalRecords])
->make(true);
}
而我的js是这个
$(function() {
$('.eventTableAll').DataTable({
processing: true,
serverSide: true,
ajax: '{!! route('datatables.alleventsData') !!}',
columns: [
{ data: 'event_name', name: 'event_name' },
{ data: 'parent', name: 'parent', searchable: true },
{ data: 'venueName', name: 'venueName', searchable: true },
{ data: 'venueLocation', name: 'venueLocation', searchable: true },
{ data: 'occurs_at', name: 'occurs_at', searchable: true },
{ data: 'hot_popular_main', name: 'hot_popular_main' },
{ data: 'synchronize', name: 'synchronize' },
{ data: 'status', name: 'status' }
]
});
});
但是问题是当我像第二秒钟一样移至下一页时,它没有任何数据,我已经看到控制台在获取数据,但没有嵌入到数据表数据索引中。
最佳答案
我两天前也遇到了同样的问题。
在这里,您将使用Datatables :: collection()手动获取具有限制和偏移量的记录。
首先,如果您在laravel设置中为表单启用了csrf:
禁用它。在Kernel.php中注释\App\Http\Middleware\VerifyCsrfToken::class
或者在datatable js函数之前的ajax标头中设置csrf
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
如果完成。仍然无法正常工作,请继续进行。
解决方案1:
在将获取的数据传递到Datatables :: collection()之前,请使用以下命令:
$allEvents = collect(array_pad($allEvents->toArray(), -($iDisplayStart + count($allEvents->toArray())), 0));
该行为您提供了响应Datatables :: collection()的数据,如下所示:
对于第1页:
数据= [0 => [event_0],1 => [event_1],... limit => [event_limit]];
对于第n页:
数据= [0 => [],1 => [],... offset-1 =?[],offset => [event_0],offset + 1 => [event_1],... offset + limit-1 => [event_limit]];
只能在集合中的偏移量之前创建空索引。
这是因为collection()或of()[或任何其他预构建函数]考虑$ iDisplayStart并从index = $ iDisplayStart的位置开始查找集合中的数据。
最后
return Datatable::of($allEvents)
->with(['recordsTotal' => $allEventsCount, 'recordsFiltered' => $allEventsCount, 'start' => $iDisplayStart])
->make();
解决方案2:
不用手动实现分页,而是使用yajra的预构建功能:
return Datatables::of($allEvents)
->filter(function ($allEvents) use ($request, $iDisplayLength, $iDisplayOffset) {
$allEvents->skip(($iDisplayOffset) * $iDisplayLength)
->take($iDisplayLength);
return $allEvents;
})
->with(['recordsTotal' => $allEventsCount, 'recordsFiltered' => $allEventsCount, 'start' => $iDisplayStart])
->make();
参考:https://datatables.yajrabox.com/eloquent/post-column-search
注意:如果上述解决方案不起作用,请注意以下所有事项:
检查您是否已包含yajra的datatables js库的最新受支持版本
检查是否从数据库中获取了指定限制的数据
检查您进行的ajax数据表调用是否为POST类型
尝试通过将以下ajax参数切换为true / false:processing,serverSide。如果在某些旧版本的数据表库中发送了ajax参数,则必须将这些参数设置为true
在两种情况下,检查返回数据表中是否包含这些行
-> with([['recordsTotal'=> $ allEventsCount,'recordsFiltered'=> $ allEventsCount,'start'=> $ iDisplayStart])
请注意,
$allEventsCount
是数据库中所有记录的计数。您需要使用->count()
手动获取解决方案3:
如果上述解决方案不起作用,
最后一种解决方案是删除Yajra,并使用客户端数据表和使用datatables.js进行分页的代码。
这不会降低性能,但是您需要做更多的客户端编码。
缓存也可用于客户端数据表。
参考:https://datatables.net/examples/server_side/pipeline.html
datatables.net/examples/data_sources/server_side.html
关于php - 将yajra数据表用于服务器端数据表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37341402/