在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字节)
答案 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()将应用于所有对象。它不会加载所有活动,而是在一个呼叫中将其删除。它也表明不了解软删除的内部工作方式,这对于前向兼容性而言是更好的选择。