Php 使用雄辩的Laravel语块法

Php 使用雄辩的Laravel语块法,php,json,laravel,laravel-5,eloquent,Php,Json,Laravel,Laravel 5,Eloquent,对于处理大型数据库,laravel提供了如下chunk方法 但是我如何在这个查询中使用chunk方法 $data = Inspector::latest('id') ->select('id', 'firstname', 'status', 'state', 'phone') ->where('firstname', 'LIKE', '%' . $searchtext . '%') -&

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

但是我如何在这个查询中使用chunk方法

 $data = Inspector::latest('id')
                ->select('id', 'firstname', 'status', 'state', 'phone')
                ->where('firstname', 'LIKE', '%' . $searchtext . '%')
                ->get();
我返回的json响应如下所示

echo json_encode($data);
任何建议…

使用
chunk()
而不是
get()
。 如。
chunk(100,function($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\u encode()

编辑

如果我完全误解了你,而你真正想做的是:

{ 1000 records } -> this is the result of your query
将其分为以下几部分:

{
    { 300 records},
    { 300 records},
    { 300 records},
    { 100 records},
}
然后您需要
集合的chunk方法:

$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->get() // now we're working with a collection
    ->chunk(300);
请记住,在得到查询结果之前,您不会使用
集合
,因此,如果您只调用
chunk()
,它将期待回调,该回调将应用于整个数据集,因为您使用的是
雄辩的

有关
集合
chunk()
方法的更多信息,请参阅此处:

否则。。。你能给你实际做的事情提供一些背景吗?听起来你真的需要分页。您对JSON数据做了什么,如何调用HTTP请求,是通过ajax实现的吗?你为什么一次需要全部1000条记录

如果您确实需要将整个数据集(1000个)发送到客户端,但每次发送300个,那么您不想使用chunk。想想在雄辩的语境中,
chunk(),它不是让区块一次返回给客户端一个区块,直到它拥有整个数据集——它是为了对区块应用一个动作,然后返回整个集合,使用它的目的是,通过加载整个集合来处理动作,它不会一次占用太多内存

如果您希望一点一点地获取整个数据集,并且分页不适合您的情况(我还不知道为什么!),那么您需要多次调用HTTP请求以逐点获取数据,并在每个请求中指定您已经拥有的内容和需要的内容

  • 可以使用变量$counter。 放
  • 如果($counter>=100){break;}
  • 可以在查看时使用
  • 使用路径/模型/用户; 用户->区块(100,函数($Users){ foreach($users作为$user){ // } });
    Chunk不是用于按请求返回数据,而是用于处理服务器上的大型表-下面是一个简单的示例,演示如何使用它(在Laravel 5.7上测试):


    我尝试了第三个答案,它是正确的,但我的问题是,如果我想显示1000条记录,但它应该发送300条记录。就像第一个300,然后是300,然后是300,作为json响应。但不是一次一千个。非常感谢。我现在有了这个概念@阿米尔太棒了!高兴的coding@haakym也许你能帮我。我想将chunk应用到我的案例中。看看这个:chunk()方法对Laravel 4和5都有效。对于Laravel 4,它获得一个可选的第二个参数来保留键,默认为false,当我检查5.7集合引用时,它将被删除。“为foreach()提供的参数无效”ok@Kamil感谢这是嵌套foreach循环中的问题,而不是父循环中的问题。我如何在视图中使用它?@Praditha不要在视图中使用这样的东西,这是一个非常糟糕的做法 if ($counter>=100) { break; } use path/models/User; Users->chunk(100, function($users) { foreach ($users as $user) { // } });
    User::chunk(100, function($users) {
        foreach ($users as $user) {
            // processing
        }
    });