2017-04-14 107 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中解決這個問題? –