如何在Laravel中的get()之后对集合进行分页?

use*_*810 2 paginate laravel

我对两个运行良好的查询结果进行了合并:

$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); 
Run Code Online (Sandbox Code Playgroud)

现在,我需要对这个新集合进行分页,并根据建议添加以下内容:

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

编辑:对于未来的读者,爱国者的答案很棒,而我做到了。

Roh*_*ami 11

分页集合的最佳方式:

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,
                ]
            );
        });
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


pat*_*cus 5

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

$pagination->links()
Run Code Online (Sandbox Code Playgroud)

要么

$pagination->render()
Run Code Online (Sandbox Code Playgroud)

另外,如果您希望对此进行一点整理,则可以修改查询,以便只执行一个查询,而无需合并两个不同的结果集。您只需要首先对日期比较的结果进行排序,然后对您的valid_to字段进行排序。

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

日期比较将返回正确/错误的结果。按照ASC顺序(未指定时为默认值),true结果将在false结果之后,因此valid_to小于$today(已过期)的行将在valid_to大于或等于的行之后$today

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

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

现在,对您的$events对象进行了分页,因此您需要使用$events->links()$events->render()