当我使用大型数据集时,我正在尝试找出在laravel中进行分页的最佳方法,我现在使用的方法是过度消耗内存。这就是我正在做的事情:我从多个表查询,映射结果等,然后合并多个集合,只有在那之后才对它进行分页,但是我意识到这确实是一个很糟糕的方法,因为我毫无疑问地查询大量数据的方式,并且随着数据的增长,它将变得越来越慢。 问题是正确的方法是什么? 我以为也许我会分页然后使用数据,问题是,例如,如果我尝试按日期对所有合并的数据进行排序,那么我将无法获得正确的结果,因为一个表可能包含的数据少于另一个...
以下一些代码可帮助您澄清问题
首先我将查询两个表订单表和交易表
$transactions = Transaction::all();
$orders = Order::all();
然后我将全部内容发送到一个动作中,以使用laravel资源将其全部映射并格式化为所需的方式
return $history->execute(['transactions' => $transactions,'orders' => $orders]);
此操作要做的就是简单地映射所有交易并返回资源,然后它将映射所有订单并为其返回资源,之后它将全部合并并返回结果。
然后我将所有这些内容通过使用Illuminate \ Pagination \ LengthAwarePaginator类的分页操作运行。
结果正是我希望它们只是内存过载的方式。
我尝试先分页而不是
$transactions = Transaction::all();
$orders = Order::all();
我做了
$transactions = Transaction::orderBy('created_at' 'desc' )->paginate($request->PerPage);
$orders = Order::orderBy('created_at' 'desc' )->paginate($request->PerPage);
,然后通过返回资源的操作运行它。 这样做有几个问题,首先,我将不再获取分页数据,因此应用程序将不知道当前页面或有多少条记录,其次,例如,如果orders表有2条记录,并且交易表有10条记录,尽管订单表的日期晚于交易表的日期,但仍然会先查询它们。