为了处理大型数据库,laravel在此处提供了块方法https://laravel.com/docs/5.1/queries#retrieving-results
但是如何在此查询中使用块方法,
$data = Inspector::latest('id')
->select('id', 'firstname', 'status', 'state', 'phone')
->where('firstname', 'LIKE', '%' . $searchtext . '%')
->get();
我在返回像这样的json响应的地方,
echo json_encode($data);
有什么建议么....
据我了解的chunk()
方法是使用,当你需要工作,一个大的数据集,并采取行动以块上的数据块。
从您的问题来看,听起来像是先执行查询,然后将数据作为JSON返回,所以对我来说,这听起来不像是对需要分块的数据集采取了措施。
如果要分解返回的JSON数据,则应该查看分页。
您可以将分页应用于查询,如下所示:
$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()
我所知的所有操作。
编辑
如果我完全误解了您,而您真正想做的是:
{ 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
直到获得查询结果,您才使用a ,因此,如果您仅调用chunk()
它,它将期待一个回调,该回调将在您使用时应用于整个数据集Eloquent
。
请参阅此处的Collection
chunk()
方法的更多信息:https : //laravel.com/docs/5.3/collections#method-chunk
否则...您能为您的实际工作提供更多背景信息吗?听起来确实需要分页。您正在处理JSON数据,以及如何通过ajax调用HTTP请求?为什么一次需要全部1000条记录?
如果确实需要将1000个完整数据集发送到客户端,但是一次发送300个,则您不想使用块。考虑一下chunk()
雄辩的背景是什么,不是要让块一次将块返回给客户端,直到它拥有整个数据集-而是要对一个块应用操作,然后返回整个集合和要点因此,通过加载整个集合来处理该操作,它一次不会占用太多内存。
如果您希望整个数据集都一点一点地设置,并且分页在您的情况下不起作用(我尚不知道为什么!),则需要多次调用HTTP请求以逐个获取数据并在每个请求中指定要求您已经拥有和需要的东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句