我正在尝试对集合进行分页,但是我正在努力找出是否有更简单的方法可以做到这一点。
我在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'));
}
还有许多其他方法可以重用私有方法。
答案 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
在您的控制器中。