Laravel,如何将集合对象转换为构建器对象
Posted
技术标签:
【中文标题】Laravel,如何将集合对象转换为构建器对象【英文标题】:Laravel, how to convert a collection object into a builder object 【发布时间】:2018-07-27 16:30:00 【问题描述】:我需要在集合上使用 paginate 和 simplepaginate,所以我试图将集合转换为构建器对象。 为此,我正在考虑创建一个函数,该函数获取集合中每个项目的 id,然后用它构建一个查询,但在我看来,这似乎占用了很多资源, 有没有更简单的方法?
【问题讨论】:
如果你能提供一些很棒的例子......将集合重新生成给构建器不是一个好主意......最好在从数据库中获取集合时直接对集合进行分页。 .laravel.com/docs/8.x/pagination#introduction 【参考方案1】:更好的方法是使用现有集合build paginator object manually。
来自the docs:
有时您可能希望手动创建一个分页实例,向其传递一组项目。您可以根据需要创建
Illuminate\Pagination\Paginator
或Illuminate\Pagination\LengthAwarePaginator
实例来实现。
Paginator
类不需要知道结果集中的项目总数;但是,正因为如此,该类没有检索最后一页索引的方法。LengthAwarePaginator
接受与Paginator
几乎相同的参数;但是,它确实需要计算结果集中的项目总数。也就是说,
Paginator
对应于查询构建器和 Eloquent 上的simplePaginate
方法,而LengthAwarePaginator
对应于 paginate 方法。
【讨论】:
【参考方案2】:在 Alexey 所说的基础上,作为替代方案,您可以手动从集合构建 Paginator。这是一种更简单的方法,不会浪费额外的查询。例如
// Collection $collection
$perPage = 10;
$currentPage = Illuminate\Pagination\Paginator::resolveCurrentPage() ?? 1;
$itemsOnPage = $collection->skip(10 * ($currentPage-1))->take($perPage);
$paginatorPath = Illuminate\Pagination\Paginator::resolveCurrentPath();
$paginator = new \Illuminate\Pagination\LengthAwarePaginator(
$itemsOnPage,
$collection->count(),
$perPage,
$currentPage,
['path' => $paginatorPath]
);
那么在你看来,
!! $paginator->render() !!
【讨论】:
这个问题的标题是“如何将集合对象转换为构建器对象”,赏金请求是“寻找明确回答问题的答案,而不是替代方法。” -- 答案不应该是构建新的分页器实例。 实际上,如果您编辑答案以便我再次投票,我将删除我的反对票,因为这实际上是有用的/原始代码。 已编辑! (您不能转换为 Builder 实例,因为 Collection 实例上不存在查询参数,并且仅对分页会适得其反。 而且 OP 确实会问“有没有更简单的方法”而不浪费资源 感谢@Jesse 的赏金以上是关于Laravel,如何将集合对象转换为构建器对象的主要内容,如果未能解决你的问题,请参考以下文章
如何合并集合和查询构建器,然后在其上使用分页 Laravel 8
如何将 laravel 模型工厂创建方法返回的对象转换为包含模型字段的数组?