如何在 Laravel 中对自定义查询的结果进行分块?
laravelphpserver side programming更新于 2025/4/30 1:07:17
如果您的数据库表包含大量数据,则最好使用 chunk() 方法。chunk() 方法可用于 DB Facade 以及 Eloquent 模型。
chunk() 负责一次获取少量数据,结果存在于闭包内以供处理。
考虑以下包含 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.""; } } } }
输出
上述代码的输出是 −


