作者: | 来源:互联网 | 2023-07-26 15:27
为了处理大型数据库,laravel提供了块方法,如https://laravel.com/docs/5.1/queries#retrieving-results所示但是如何在此查询
为了处理大型数据库,laravel提供了块方法,如https://laravel.com/docs/5.1/queries#retrieving-results所示
但是如何在此查询中使用chunk方法,
$data = Inspector::latest('id')->select('id', 'firstname', 'status', 'state', 'phone')->where('firstname', 'LIKE', '%' . $searchtext . '%')->get();
我正在返回这样的json响应,
echo json_encode($data);
有什么建议….
解决方法:
据我所知,chunk()方法适用于需要使用大型数据集并按块执行该数据块的操作.
从您的问题来看,这听起来就像您正在执行查询然后将数据作为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(),据我所知.
编辑
如果我完全误解了你,你真正想要做的是:
{ 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数据做什么以及如何通过ajax调用HTTP请求?为什么一次需要全部1000条记录?
如果你确实需要将1000的整个数据集发送到客户端,但一次只需要300个,那么你不想使用chunk.想想chunk()在eloquent的上下文中是什么,它不是为了让块一次返回一个块,直到它拥有整个数据集 – 它是用于将一个动作应用于一个块然后返回整个集合并且使用它的关键是它通过加载整个集来处理动作,一次不占用太多内存.
如果你想要逐位整个数据集并且分页对你的情况不起作用(我还没看到原因!)你将需要多次调用HTTP请求以逐位获取数据并在每个数据中指定请求你已经拥有的和你需要的东西.