为了处理大型数据库,laravel提供了如下的chunk方法

但是在这个查询中我怎么能使用chunk方法呢,

 $data = Inspector::latest('id')
                ->select('id', 'firstname', 'status', 'state', 'phone')
                ->where('firstname', 'LIKE', '%' . $searchtext . '%')
                ->get();

在这里,我会像这样返回json响应,

echo json_encode($data);

有什么建议吗....

推荐答案

据我所知,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请求来逐位获取数据,并在每个请求中指定您已经拥有的内容和需要的内容.

Laravel相关问答推荐

如何返回Blade Laravel 中的按钮?

Laravel 9 如何将 url 中的参数从一个控制器传递到另一个控制器?

如何自定义密码确认不匹配.错误信息?

如何在 Laravel 的外部 js 文件中包含 csrf_token()?

安卓 retrofit |发布自定义对象(将 json 发送到服务器)

Laravel 5.1 - 如何在进度条上设置消息

Laravel 5.1 如何在Blade 文件上使用 {{ old('') }} 助手进行无线电输入

Laravel:Blade foreach 循环 bootstrap 列

如何在 AWS Elastic Beanstalk 上设置和使用 Laravel 调度?

调用未定义的函数 mb_strimwidth

如何更改 ember-cli 中的 dist 文件夹路径?

如何处理 laravel 5 中的私有图像?

升级到 Laravel 5.2 会使所有会话失效

Laravel 动作未定义

Laravel Eloquent:计算总价的最佳方法

干预图像:直接从带有原始文件名和分机的网址保存图像?

使用 Laravel 将两个模型合并到一个分页查询中,并带有Eager加载的关系

Laravel 4 - 一个表单中有两个提交按钮,并且两个提交都由不同的操作处理

如何在laravel中 for each 用户生成唯一的随机值并将其添加到数据库中

如何在 Laravel 5 请求类中使用有时规则