想象一下您正在使用 chunk 方法删除所有记录。该表有 2,000,000 条记录,您将按 1000 个块删除所有记录。
$query->orderBy('id')->chunk(1000, function ($items) {
foreach($items as $item) {
$item->delete();
}
});
它将通过在查询中获取前 1000 条记录来删除前 1000 条记录,如下所示:
SELECT * FROM table ORDER BY id LIMIT 0,1000
然后 chunk 方法的另一个查询是:
SELECT * FROM table ORDER BY id LIMIT 1000,2000
我们的问题是,我们删除 1000 条记录,然后得到从 1000 到 2000 条的结果。实际上,我们丢失了前 1000 条记录,这意味着我们不会在块的第一步中删除 1000 条记录!此场景对于其他步骤也是相同的。在每一步中,我们都会丢失 1000 条记录,这就是我们在这些情况下无法获得最佳结果的原因。
我做了一个删除的例子,因为这样我们就可以知道 chunk 方法的确切行为。
UPDATE:
您可以使用chunkById()
以安全删除。
在这里阅读更多内容:
http://laravel.at.jeffsbox.eu/laravel-5-eloquent-builder-chunk-chunkbyid http://laravel.at.jeffsbox.eu/laravel-5-eloquent-builder-chunk-chunkbyid
https://laravel.com/api/5.4/Illuminate/Database/Eloquent/Builder.html#method_chunkById https://laravel.com/api/5.4/Illuminate/Database/Eloquent/Builder.html#method_chunkById