使用雄辩的Laravel Chunk方法

2022-08-30 22:52:13

为了处理大型数据库,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);

任何建议...


答案 1

据我所知,当您需要处理大型数据集并逐块对该数据执行操作时,可以使用该方法。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,因此,如果您只是调用它,则会出现一个回调,该回调将应用于整个数据集,因为您正在使用 。Collectionchunk()Eloquent

有关此处方法的进一步阅读,请参阅此处:https://laravel.com/docs/5.3/collections#method-chunkCollectionchunk()

否则。。。你能提供更多关于你实际在做什么的背景吗?这听起来真的像是你需要分页。您正在如何处理 JSON 数据,以及如何调用 HTTP 请求,是通过 ajax 进行的吗?为什么需要同时完成整个 1000 条记录?

如果你真的需要将1000个数据集发送到客户端,但一次300个,那么你不想使用块。想想在雄辩的上下文中有什么用,它不是为了让块一次返回给客户端一个块,直到它具有整个数据集 - 它是用于将操作应用于块,然后返回整个集合,使用它的意义在于它不会通过加载整个集合来处理操作而一次占用太多内存。chunk()

如果你想要整个数据集一点一点地,并且分页不适用于你的情况(我还没有明白为什么!)你需要多次调用HTTP请求来逐点获取数据,并在每个请求中指定你已经拥有的东西和你需要什么。


答案 2

Chunk不是用于通过请求返回数据,而是用于处理服务器上的大型表 - 下面是一个简单的示例,演示如何使用它(在Laravel 5.7上测试):

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // processing
    }
});

推荐