使用雄辩的Laravel Chunk方法

时间:2016-10-11 07:51:05

标签: php json laravel laravel-5 eloquent

为了处理大型数据库,laravel提供了chunk方法,如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);

任何建议......

4 个答案:

答案 0 :(得分:13)

据我了解,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()在eloquent的上下文中是什么,它不是为了让块一次返回一个块,直到它拥有整个数据集 - 它是用于将一个动作应用于一个块然后返回整个集合以及使用它的关键点是它通过加载整个集来处理动作,一次不占用太多内存。

如果你想要逐位整个数据集并且分页对你的情况不起作用(我还没看到原因!)你需要多次调用HTTP请求来逐位获取数据在每个请求中指定您已拥有的和您需要的内容。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

  1. 可以使用变量$ counter。 并把
  2. 
        if ($counter>=100) { break; }
    
    
    1. 可以使用
    2. 调用视图
      
          use path/models/User;
          Users->chunk(100, function($users) {
              foreach ($users as $user) {
                  //
              }
          });