使用Eloquent的Laravel Chunk方法

Aam*_*mir 4 php json laravel eloquent laravel-5

对于处理大型数据库,laravel提供了块方法,如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();
Run Code Online (Sandbox Code Playgroud)

我正在返回这样的json响应,

echo json_encode($data);
Run Code Online (Sandbox Code Playgroud)

有什么建议....

haa*_*kym 13

据我了解的chunk()方法是使用,当你需要一个大的数据集工作,并采取行动以块上的数据块.

从您的问题来看,这听起来就像您正在执行查询然后将数据作为JSON返回给我,这听起来并不像您在数据集上采取需要分块的操作.

如果你想分解返回的JSON数据,你应该看看分页.

您可以像这样对您的查询应用分页:

$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate();
Run Code Online (Sandbox Code Playgroud)

您可以通过将数字传递给paginate方法来指定每个集合的大小:

$data = Inspector::latest('id')
    ->select('id', 'firstname', 'status', 'state', 'phone')
    ->where('firstname', 'LIKE', '%' . $searchtext . '%')
    ->paginate(25);
Run Code Online (Sandbox Code Playgroud)

如果我误解了你确实想要进行分块,我相信你可以做到以下几点:

$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
        }
    });
Run Code Online (Sandbox Code Playgroud)

此外,如果您正在返回一个雄辩的对象,它将自动转换为json,因此您不需要执行json_encode()我所知的任何事情.

编辑

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

{ 1000 records } -> this is the result of your query
Run Code Online (Sandbox Code Playgroud)

把它分成这个:

{
    { 300 records},
    { 300 records},
    { 300 records},
    { 100 records},
}
Run Code Online (Sandbox Code Playgroud)

然后你想要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);
Run Code Online (Sandbox Code Playgroud)

请记住,在Collection获得查询结果之前,您不会使用a ,所以如果您只是调用chunk()它,则会期待回调,这将在您使用时应用于整个数据集Eloquent.

有关此Collection chunk()方法的详细信息,请参阅此处:https://laravel.com/docs/5.3/collections#method-chunk

否则......你能否为你实际做的事情提供更多背景信息?听起来你需要分页.您在使用JSON数据做什么以及如何通过ajax调用HTTP请求?为什么一次需要全部1000条记录?

如果您确实需要将1000的整个数据集发送到客户端,但一次只需300个,那么您不想使用块.想想chunk()在eloquent的上下文中是什么,它不是为了让块一次返回客户端一块,直到它拥有整个数据集 - 它是为了将一个动作应用于块然后返回整个集合和点使用它是因为它不会通过加载整个集来处理动作一次占用太多内存.

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


小智 5

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

  • 我如何在视图上使用它? (2认同)

Kam*_*ski 5

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

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // processing
    }
});
Run Code Online (Sandbox Code Playgroud)