如何在 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.""; } } } }
输出
以上代码的输出为:
广告