【问题标题】:How to paginate a collection after get() in Laravel?如何在 Laravel 中的 get() 之后对集合进行分页?
【发布时间】:2017-09-14 16:13:45
【问题描述】:

我对两个查询结果进行了合并,效果很好:

$events1 = \App\Event::Where('valid_to','>=',$today)->orderByRaw('valid_to','ASC')->get();
$events2 = \App\Event::Where('valid_to','<',$today)>orderByRaw('valid_to','ASC')->get();
$events = $events1->merge($events2); 

现在我需要对这个新集合进行分页,并按照建议添加了这个片段:

$page = 1;
$perPage = 60;
$pagination = new \Illuminate\Pagination\LengthAwarePaginator(
    $events->forPage($page, $perPage), 
    $events->count(), 
    $perPage, 
    $page
);

编辑:对于未来的读者,帕特里克斯的回答效果很好,我做到了。

【问题讨论】:

    标签: laravel pagination


    【解决方案1】:

    分页收集的最佳方式:

    1- 将此添加到 \app\Providers\AppServiceProvider 中的引导功能

      /**
             * Paginate a standard Laravel Collection.
             *
             * @param int $perPage
             * @param int $total
             * @param int $page
             * @param string $pageName
             * @return array
             */
            Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') {
                $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
                return new LengthAwarePaginator(
                    $this->forPage($page, $perPage),
                    $total ?: $this->count(),
                    $perPage,
                    $page,
                    [
                        'path' => LengthAwarePaginator::resolveCurrentPath(),
                        'pageName' => $pageName,
                    ]
                );
            });
    

    2-从此以后所有的收藏都可以这样分页

    $events1 = \App\Event::Where('valid_to','>=',$today)->orderByRaw('valid_to','ASC')->get();
    $events2 = \App\Event::Where('valid_to','<',$today)>orderByRaw('valid_to','ASC')->get();
    $events = $events1->merge($events2); 
    
    $events->paginate(5)
    

    【讨论】:

      【解决方案2】:

      您在错误的对象上调用 links()render()。您已将分页器分配给 $pagination 变量。你应该打电话来

      $pagination->links()
      

      $pagination->render()
      

      此外,如果您想稍微清理一下,您可以修改查询,使您只有一个查询,而无需组合两个不同的结果集。您只需先按日期比较的结果排序,然后按您的valid_to 字段排序。

      $events = \App\Event::orderByRaw('valid_to < ?', [$today])->orderBy('valid_to')->get();
      

      日期比较将返回真/假结果。在 ASC 顺序中(未指定时默认),true 结果将排在 false 结果之后,因此 valid_to 小于 $today(过期)的行将排在 valid_to 大于的行之后或等于$today

      然后,该结果集将按 valid_to 字段本身排序。这一个查询为您提供与您手动合并的两个查询相同的结果。而且,当然,您可以只对这个查询进行分页:

      $events = \App\Event::orderByRaw('valid_to < ?', [$today])->orderBy('valid_to')->paginate(60);
      

      现在,分页的是您的$events 对象,因此您可能希望使用$events-&gt;links()$events-&gt;render()

      【讨论】:

      • 感谢您的回复。我这样做了,只要 $page = 1 它就可以工作,但是当我将 $page =2 用于调试时出现问题,我得到“尝试获取非对象的属性(视图:...”我试图找出导致问题的非对象。
      猜你喜欢
      • 2021-04-18
      • 2015-08-05
      • 2018-05-10
      • 1970-01-01
      • 2015-09-30
      • 2017-05-03
      • 1970-01-01
      • 2021-07-16
      • 2022-10-14
      相关资源
      最近更新 更多