【问题标题】:Laravel Datatables pagination(when limit used on server side) issueLaravel Datatables 分页(在服务器端使用限制时)问题
【发布时间】:2018-01-20 15:51:05
【问题描述】:

我遇到了有关数据表的问题。我在 laravel 工作并使用 yajra/laravel-datatables-oracle 包。

在我的一个产品部分中,有 100-200k 条记录。当我点击我的产品列表时,加载需要很长时间,因为我从数据库中获取所有记录。

我正在尝试根据限制获取记录,但这会在分页和搜索中产生问题。只有一个分页链接有效,所有其他页面返回空数据。

下面是我的服务器端代码:

$skip = $request->get('start') != null ? $request->get('start') : 0;
$take = $request->get('length') != null ? $request->get('length') : 10;
$products = Product::skip($skip)->take($take)->get();
$count = Product::get()->count();   
return Datatables::of($products)->setTotalRecords($count)->make(true); 

ajax 响应:

{"draw":2,"recordsTotal":121,"recordsFiltered":121,"data":[],

这里数据是空的,不知道ajax调用时如何追加数据。

当我们有大量记录时我如何编码?

【问题讨论】:

  • Product::paginate($take) 怎么样?检查laravel.com/docs/5.4/pagination
  • 感谢您的快速回复,但分页不适用于数据表。分页也由数据表处理。 setTotalRecords($count) 将制作分页链接。
  • @sunil:你检查过custom filter吗?

标签: laravel pagination datatables yajra-datatable


【解决方案1】:

要处理大数据,您需要使用 yajra-datatables 服务器端处理。 在你的 javascript 句柄中是这样的:

<script>
$(document).ready(function() {
    $('.datatable').DataTable({
        processing: true,
        serverSide: true,
        ajax: '{{ route(' serverSide ') }}',
        columns: [
          {data: 'name', name: 'name'}
        ]
    });
});

然后在路线上做这样的事情

    Route::get('/serverSide', function () {
        $products = Product::all();
        return Datatables::of($products)->make(true);
         })->name('serverside');

编辑:

您返回的是集合而不是构建器。在 github 中检查这些问题 #575#1053

【讨论】:

  • 嗨,这在我的情况下不起作用,因为它会从 product table(Product::all()) 加载所有数据。我需要根据 Product::skip($skip)->take($take)->get(); 之类的限制获取记录
  • 不,它不会从产品表中加载所有数据。您应该在控制台面板上检查您的 XHR 请求。每次点击分页号时,它都会发送一个 ajax 请求并根据页面长度加载数据。
  • 快速说明,您应该使用构建器来获得更好的结果,而不是使用集合。你应该摆脱 get() 方法和 setTotalRecords($count)。
  • 请检查我的答案编辑。希望能解决您的问题。
  • 嗨 Nowshad,感谢您的回复。您的意思是 Product::all() 将根据开始和结束限制获取记录...
【解决方案2】:

将变量名称length 与您的限制值一起传递。例如:

$('#tasks-table').on('preXhr.dt', function (e, settings, data) {
        data['employee'] = $('#employeeId').val();
        data['length'] = 20; //This is the pagination limit data variable
});

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 1970-01-01
    • 2012-07-18
    • 2014-11-13
    • 2018-06-19
    • 2011-03-23
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多