【问题标题】:How to Paginate Available Collection [Laravel 4.2]如何对可用集合进行分页 [Laravel 4.2]
【发布时间】:2015-09-30 23:02:01
【问题描述】:

假设我的数据库中有 200 条记录。在显示这些记录时,我想对它们进行分页。正常的方法是做类似

$tasks = Tasks::paginate(10); 

然后

$tasks->links();

该代码运行良好。但是,使用该代码,您将在每次获取这 10 行时运行 DB 查询(200/10= 所有行的 20 次)。

我需要的是一次获取所有数据,将它们存储在一个集合中(比如$tasks),然后对resulting collection 进行分页,而不是再次从数据库中获取。

更重要的是,我需要查询诸如“仅获取 100 条记录并将它们分页 10”之类的内容,如果是这样的话,那就太好了

Tasks::take(100)->paginate(10) 

但不幸的是,即使这样也行不通。

有人知道如何解决这些问题吗?

【问题讨论】:

    标签: php laravel laravel-4 pagination eloquent


    【解决方案1】:

    Laravel 5

    $tasks = Tasks::take(100); // fetch 100 tasks
    
    // initialize paginator
    $paginator = new \Illuminate\Pagination\Paginator($tasks, 10, $pageNumber); 
    
    // get current page of tasks
    $currentPage = $paginator->items();
    

    为了获得不同的任务页面,您需要创建新的 Paginator 对象,因为它不存储整个任务集合,而只存储当前页面。

    Laravel 4

    Laravel 4 中的 Paginator 似乎没有“处理分页”,这意味着它希望您传递的不是所有项目,而是当前页面中的项目。在 L5 中,您可以传递所有项目和当前页面,Paginator 会为您处理所有事情。

    为了在 L4 中使用 Paginator,您需要自己对任务进行切片,然后使用 Paginator 外观(内部使用 Illuminate\Pagination\Factory)来创建 Paginator 对象。

    use Paginator;
    
    $tasks = Tasks::take(100);
    $currentPageTasks = $tasks->slice(($currentPage - 1) * $perPage, $perPage);
    Paginator::make($currentPageTasks, $tasks->count(), $perPage);
    

    我不确定以这种方式构建的 Paginator 是否对您有用。

    【讨论】:

    • 我尝试了你的建议,但收到Argument 1 passed to Illuminate\Pagination\Paginator::__construct() must be an instance of Illuminate\Pagination\Factory, instance of Illuminate\Database\Eloquent\Builder 异常
    • 哦,对不起,我检查了 Laravel 5 分页器,我会在几分钟内更新答案:)
    • 我只是继续刷新页面,我想你还在努力@jedrzej.kurylo :)
    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 2018-05-10
    • 2017-05-03
    • 2015-08-05
    • 2016-05-11
    • 1970-01-01
    • 2017-09-14
    • 2020-06-28
    相关资源
    最近更新 更多