据我所知,当您需要处理大型数据集并逐块对该数据执行操作时,可以使用该方法。chunk()
从您的问题来看,这听起来像是您正在执行查询,然后将数据作为JSON返回,因此对我来说,这听起来不像您正在对需要分块的数据集执行操作。
如果要拆分返回的 JSON 数据,则应改为查看分页。
您可以对查询应用分页,如下所示:
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->paginate();
您可以通过将数字传递给分页方法来指定每个集的大小:
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->paginate(25);
如果我误解了,而你确实想做分块,我相信你可以做以下事情:
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->chunk(50, function($inspectors) {
foreach ($inspectors as $inspector) {
// apply some action to the chunked results here
}
});
另外,如果你返回一个雄辩的对象,它将自动转换为json,所以你不需要执行,据我所知。json_encode()
编辑
如果我完全误解了你,你真正想做的是这样的:
{ 1000 records } -> this is the result of your query
将其拆分为:
{
{ 300 records},
{ 300 records},
{ 300 records},
{ 100 records},
}
然后,您需要 的块方法:Collection
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->get() // now we're working with a collection
->chunk(300);
请记住,在获得查询结果之前,您不会使用 a,因此,如果您只是调用它,则会出现一个回调,该回调将应用于整个数据集,因为您正在使用 。Collection
chunk()
Eloquent
有关此处方法的进一步阅读,请参阅此处:https://laravel.com/docs/5.3/collections#method-chunkCollection
chunk()
否则。。。你能提供更多关于你实际在做什么的背景吗?这听起来真的像是你需要分页。您正在如何处理 JSON 数据,以及如何调用 HTTP 请求,是通过 ajax 进行的吗?为什么需要同时完成整个 1000 条记录?
如果你真的需要将1000个数据集发送到客户端,但一次300个,那么你不想使用块。想想在雄辩的上下文中有什么用,它不是为了让块一次返回给客户端一个块,直到它具有整个数据集 - 它是用于将操作应用于块,然后返回整个集合,使用它的意义在于它不会通过加载整个集合来处理操作而一次占用太多内存。chunk()
如果你想要整个数据集一点一点地,并且分页不适用于你的情况(我还没有明白为什么!)你需要多次调用HTTP请求来逐点获取数据,并在每个请求中指定你已经拥有的东西和你需要什么。