据我所知,chunk()
方法适用于需要处理大型数据集的情况,take an action方法用于逐块处理数据.
从你的问题来看,听起来像是在执行一个查询,然后以JSON的形式返回数据,所以对我来说,听起来不像是在对数据集采取需要分块的操作.
如果你想分解返回的JSON数据,你应该看pagination.
您可以对查询应用分页,如下所示:
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->paginate();
通过将数字传递给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()
次.
EDIT
如果我完全误解了你,而你真正想做的是:
{ 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);
请记住,在得到查询结果之前,您不会使用Collection
,因此,如果您只调用chunk()
,它将期待一个回调,它将应用于整个数据集,就像您使用Eloquent
一样.
请参阅此处的Collection
chunk()
方法:https://laravel.com/docs/5.3/collections#method-chunk
否则你能为你实际做的事情提供更多的背景吗?听起来你真的需要分页.你在用JSON数据做什么?你是如何调用HTTP请求的?它是通过ajax实现的吗?你为什么一次需要全部1000条记录?
如果您真的需要将chunk()
0个数据集全部发送到客户端,但每次发送300个数据集,那么您不想使用chunk.在Eloquent 的语境中思考chunk()
的意义,它不是让区块一次返回给客户机一个区块,直到它拥有整个数据集——它是为了对区块应用一个动作,然后返回整个集合,使用它的目的是,通过加载整个集合来处理动作,一次不会占用太多内存.
如果你想要一点一点地设置整个数据集,那么分页就不适合你的情况(我还不知道为什么!)您需要多次调用HTTP请求来逐位获取数据,并在每个请求中指定您已经拥有的内容和需要的内容.