2016-10-11 116 views

回答

4

据我了解的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 
     } 
    }); 

Al所以,如果你返回一个雄辩的对象,它会自动转换为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工作。

见这里的Collectionchunk()方法这里进一步阅读:https://laravel.com/docs/5.3/collections#method-chunk

否则......你能不能给一些上下文你实际上在做什么?这听起来像你需要分页。你对JSON数据做了什么?你如何调用HTTP请求,是通过ajax?为什么一次需要全部1000条记录?

如果您确实需要发送给客户端的整个数据集1000,但一次只有300个数据集,那么您不想使用块。想想chunk()在言语的上下文中的作用,它并不是让数据块一次返回到客户端,直到它具有整个数据集 - 这是为了对一个块应用一个动作,然后返回整个集合和使用它的一点是,它不会占用太多的内存在一次加载整个集处理的行动。

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

+0

我已经试过第三个答案,这是正确的,但我的问题是,如果我想要显示1千条记录,但它应该发送300条记录。像第一个300,然后300,然后300,作为JSON响应。但一次不会有一千个。 – Aamir

+0

我为你的努力向上提出了你的答案。 :) – Aamir

+0

非常感谢..我现在有了这个概念。 :) – Aamir

2

而不是get()使用chunk()。例如, chunk(100, function($data) {})

0
  1. 可以使用变量$计数器。 并把
 

    if ($counter>=100) { break; } 

  • 可以要求查看与
  •  
    
        use path/models/User; 
        Users->chunk(100, function($users) { 
         foreach ($users as $user) { 
          // 
         } 
        });