【问题标题】:Why pagination is not working with Yajra data tables in Laravel 5.2为什么分页不适用于 Laravel 5.2 中的 Yajra 数据表
【发布时间】:2017-04-14 06:51:59
【问题描述】:

我在 Laravel 5.2 中使用 Yajra 数据表加载一个 db 表。我的表包含超过 50K 的记录,所以 get() 方法会占用大量内存。但是,我使用paginate()的方法,出现错误:

Macroable.php 第 74 行中的 BadMethodCallException: 方法 getQuery 不存在。

代码是:

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

【问题讨论】:

    标签: laravel-5 pagination yajra-datatable


    【解决方案1】:

    Datatables 通常需要一个 QueryBuilder 对象,一旦您调用paginate(),您基本上就是在使用一个集合。您可以使用Datatables::collection(),但您不希望这样做,因为它要求您从数据库中获取所有内容,而您不想这样做。

    使用 yajra 您应该使用 ajax 调用来分页,它将处理分页(不是 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,它们将用于前端数据表库的分页。

    【讨论】:

    • 嗨罗伯特!感谢您的回答。您能否建议我一种在不消耗太多内存的情况下高效检索和列出 100K 记录的方法?
    • !我已经尝试过上述过程,但问题是当我运行此命令时“$builder = Order::where('order_status', 'Delivered');” ,它会消耗大量内存,因为有超过 50K 的记录。如何在 laravel 5.2 中克服这个问题?
    • @AliHamza 您还在控制器操作中调用构建器吗?您应该只显示带有空表的视图,并让数据表在数据表路由上异步获取第一页。
    • 我在 ajax 中添加了 "draw": 1, "recordsTotal": 57, "recordsFiltered": 57,但是数据表一直在处理,你知道如何解决吗? @罗伯特
    • @swm 没有更多信息。这个答案也是 3 年前给出的,从那时起图书馆发生了变化。例如,绘图参数不是界面的一部分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 2018-03-23
    • 2015-03-31
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多