laravel软删除操作耗尽了内存大小

时间:2018-10-12 13:19:20

标签: php laravel

在Laravel 5.6中,当我尝试使用我的函数软删除具有大记录的表中的所有数据时:

public function clearActivityLog() {
    $activities = Activity::all();

    foreach ($activities as $activity) {
        $activity->delete();
    }

    return redirect('admin/activity')
        ->with('success', trans('backend/main.logs.activity.messages.logClearedSuccessfuly'));
}

我收到此错误:

  

允许使用的内存大小为134217728字节(尝试分配20480字节)

3 个答案:

答案 0 :(得分:3)

如果有很多活动,这可能会产生大量查询。可以通过以下一种查询来完成:

Activity::query()->update('deleted_at', now());

softdeletes使用deleted_at列检查是否删除了该行。因此,手动为所有行设置列会产生相同的效果。

答案 1 :(得分:2)

在这种情况下,Jerodev的答案很好。

在某些情况下,您无法进行批量更新(例如,如果您需要对每个项目进行处理,或者需要触发口才事件)。在这种情况下,可以通过使用chunk来避免内存不足:

Activity::chunk(100, function($activities) {
    foreach ($activities as $activity) {
        $activity->delete();
    }
});

这样做一次只能将100个(您可以在此处选择任何数字)提取到内存中(与Activity::all()相比,这一次将每个单一活动加载到内存中;如果数百万行,您可以轻松理解为什么会出现内存错误。

答案 2 :(得分:2)

更“雄辩”的解决方案(可能还有更多的未来证明)

Activity::query()->delete();

这将不受限制地检索Activity模型的查询构建器,因此delete()将应用于所有对象。它不会加载所有活动,而是在一个呼叫中将其删除。它也表明不了解软删除的内部工作方式,这对于前向兼容性而言是更好的选择。