В 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'));
}
Я получаю такую ошибку:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)






Если есть много действий, это потенциально может вызвать огромное количество запросов. Это можно сделать с помощью одного запроса:
Activity::query()->update('deleted_at', now());
softdeletes использует столбец deleted_at, чтобы проверить, удалена ли строка. Таким образом, установка столбца вручную для всех строк дает тот же эффект.
Исправлено, если сначала поставить query().
В этом случае ответ Джеродева хорош.
В некоторых случаях вы не можете выполнить массовое обновление (например, если вам нужно выполнить обработку для каждого элемента или если вам нужно запускать события Eloquent). В этих случаях вы можете избежать нехватки памяти, используя chunk:
Activity::chunk(100, function($activities) {
foreach ($activities as $activity) {
$activity->delete();
}
});
При этом в память загружается только 100 (вы можете выбрать любое число здесь) за раз (по сравнению с Activity::all(), который загружает каждое действие в память сразу; если это миллионы строк, вы можете легко понять, почему вы получите ошибку памяти).
Мне это нравится, потому что если по какой-либо причине мягкое удаление в конечном итоге превратится в жесткое удаление, это продолжит работать.
То же самое и с Activity::query()->delete();, и для него требуется один запрос к базе данных вместо одного для каждого действия в базе данных.
Более "красноречивое" решение (и, вероятно, более перспективное для будущего)
Activity::query()->delete();
Это извлекает построитель запросов для модели Activity без ограничений, поэтому delete () будет применяться ко всем. Он не загружает все действия, а вместо этого удаляет их за один вызов. Он также показывает отсутствие знаний о внутренней работе мягких удалений, что предпочтительно для прямой совместимости.
Я попробовал этот ответ, прежде чем опубликую свою проблему, и просто удалил все записи, но не мягкое удаление.
Пожалуйста, дважды проверьте, что это правда, и если да, сообщите об ошибке команде Laravel на github.
ты тоже правильно работаешь, но я не знаю, почему у меня возникла такая проблема !! в любом случае спасибо всем.
хороший ответ, но нестатический метод update () не должен вызываться статически