如何在 Laravel 中分块处理自定义查询的结果?


如果您的数据库表包含大量数据,则最好使用chunk()方法。chunk()方法可用于 DB facade 和 Eloquent 模型。

chunk()负责一次获取少量数据,结果在闭包中进行处理。

考虑以下 users 表,其中包含 1000 条记录。我们将使用chunk()一次检索 100 条记录。

示例 1

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class UserController extends Controller { public function index() { DB::table('users')->orderBy('id')->chunk(100, function ($users) { foreach ($users as $user) { echo $user->id."=>".$user->name." "; } }); } }

要使用 DB facade,请包含类Illuminate\Support\Facades\DB;

在上面的示例中,chunk()将负责一次获取 100 条记录并在foreach()中使用。它将批量处理 100 条记录,直到所有记录都被提取。

输出

以上输出为:

示例 2

如果您想停止处理,可以按如下所示进行:

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; //use App\Models\User; use Illuminate\Support\Facades\DB; class UserController extends Controller{ public function index() { DB::table('users')->orderBy('id')->chunk(100, function ($users) { foreach ($users as $user) { echo $user->id."=>".$user->name." "; if ($user->id == 150) { return false; } } }); } }

您可以在不需要chunk()进一步处理的条件下返回 false。

输出

以上输出如下:

示例 3

在 Eloquent User 模型上使用chunk()

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; //use Illuminate\Support\Facades\DB; class UserController extends Controller{ public function index() { User::orderBy('id')->chunk(100, function ($users) { foreach ($users as $user) { echo $user->id."=>".$user->name." "; } }); } }

输出

以上代码的输出为:

示例 4

在 Eloquent 模型上使用chunk()

<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\User; class UserController extends Controller{ public function index() { $users = User::all(); $chunkedUsers = $users->chunk(10); foreach ($chunkedUsers as $records) { foreach($records as $user) { echo $user->id."=>".$user->name.""; } } } }

输出

以上代码的输出为:

更新于:2022年8月30日

7K+ 次浏览

启动您的 职业生涯

完成课程获得认证

开始学习
广告