0

在 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 字节)

4

3 回答 3

3

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

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

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

于 2018-10-12T13:21:30.577 回答
1

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

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

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

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

于 2018-10-12T13:25:44.827 回答
1

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

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

这将检索 Activity 模型的查询构建器,没有任何限制,因此 delete() 将应用于所有。它不会加载所有活动,而是在一次调用中删除它们。它还显示不了解软删除的内部工作,这对于向前兼容是更可取的。

于 2018-10-12T13:33:08.257 回答