2017-04-14 112 views
0

我正在使用Laravel 5.2中的Yajra数据表加载一个数据库表。我的表格包含超过50K的记录,因此get()方法占用大量内存。然而,我使用paginate()方法,将发生错误:为什么分页不能与Laravel 5.2中的Yajra数据表一起使用

BadMethodCallException在Macroable.php线74: 方法getQuery不存在。

代码是:

$required_orders = Order::where('order_status','Delivered')->paginate(); 
return Datatables::of($required_orders)->make(true); 

回答

0

数据表通常需要一个QueryBuilder的对象,一旦你叫paginate()你基本上是一个收集。您可以使用Datatables::collection(),但您不希望这样做,因为它需要您从数据库中获取所有您不想执行的操作。

使用yajra你应该使用ajax调用paginate,它将处理分页(而不是Laravel),因此它需要QueryBuilder执行计数等来返回分页数据和元数据。

最好的办法是创建一个单独的数据表(API)的路线,并检查了 datatables.net server side processing

编辑:

继服务器端的例子处理,你会想要做的事,如:

$(document).ready(function() { 
    $('#yourDatatableId').DataTable({ 
     "processing": true, 
     "serverSide": true, 
     "ajax": "/api/datatables/order" 
    }); 
}); 

而让路线返回类似:

$builder = Order::where('order_status', 'Delivered'); 

return Datatables::of($builder)->make(true); 

对于html部分,请查看示例,基本上,您可以在javascript中定义列,并且它会从返回的数据中填充行。同时结帐datatables server side manual,你会看到startlength,这将用于前端数据表lib的分页。

+0

嗨罗伯特!感谢您的回答。你能否建议我一种方法来检索并高效地列出100K记录而不消耗太多内存? –

+0

@AliHamza查看更新回答 – Robert

+0

!我已经尝试了上面提到的过程,但问题是,当我运行这个命令“$ builder = Order :: where('order_status','Delivered');”由于有超过5万条记录,它会消耗大量内存。 如何在laravel 5.2中解决这个问题? –