Laravel Collection分页

时间:2018-07-25 14:33:23

标签: php laravel eloquent

我正在尝试对集合进行分页,但是我正在努力找出是否有更简单的方法可以做到这一点。

我在AppServiceProvider中添加了以下宏:

Collection::macro('paginate', function($perPage) {
    $page = request()->page ?: 0;

    $slice = $this->chunk($perPage)[$page > 0 ? $page - 1 : 0];

    return new LengthAwarePaginator($slice, $this->count(), $perPage, $page, [
        'path' => url()->current(),
    ]);
});

这似乎暂时有效,但我想知道从长远来看这是否可行?是否可以在结果成为集合之前对其进行分页?例如,这是我获取要分页的收藏集的方法:

在我的存储库中,我有:

private function eagerLoadQuotes()
{
    return Quote::with([
        'user', 
        'home', 
        'home.customer', 
        'installation', 
        'installation.commission', 
        'installation.preInstallationSurvey', 
        'installation.jobSheet'
    ]);
}

public function unstarted()
{
    return $this->eagerLoadQuotes()->find(
            Installation::doesntHave('preInstallationSurvey')
            ->pluck('quote_id')
        );
}

private function mine($collection)
{
    return $collection->filter(function ($item, $key) {
        return $item->user_id == auth()->user()->id;
    });
}

public function myUnstarted()
{
    return $this->mine($this->unstarted());
}

然后在控制器中得到它:

public function myUnstarted()
{
    $quotes = $this->installations->myUnstarted();

    return view('installations.viewAll', compact('quotes'));
}

还有许多其他方法可以重用私有方法。

2 个答案:

答案 0 :(得分:0)

为什么不使用Laravel的default provided pagination

在您的控制器中返回引号:

$quotes = Quote::with(['user', 'home', 'home.customer', 'installation', 'installation.commission', 'installation.preInstallationSurvey', 'installation.jobSheet'])
    ->find(Installation::doesntHave('preInstallationSurvey')->pluck('quote_id'))
    ->filter(function ($item, $key) {
        return $item->user_id == auth()->user()->id;
    }
)->paginate(10); // Number of results per page

然后在您看来:

{{ $quotes->links() }}

这将仅查询给定数量的每页请求的行,而不是返回所有引号实例,然后在此之后对数组进行分块。将在大型馆藏上提供更好的性能。

答案 1 :(得分:0)

有人创建了这个Gist,我认为它将解决您的问题。

先前的答案将适用于Resultset集合,我想您是在询问lubridate::date(df1$date)。如果是这种情况,请参阅链接的Gist,它将类似于:

Illuminate\Support\Collection

在您的控制器中。