объем памяти исчерпан действием мягкого удаления laravel - PullRequest
0 голосов
/ 12 октября 2018

В 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 голосов
/ 12 октября 2018

Хороший ответ Джеродева в этом сценарии.

В некоторых случаях вы не можете выполнить массовое обновление (например, если вам нужно выполнить обработку каждого элемента или если вам нужны события Eloquent дляПожар).В этих случаях вы можете избежать нехватки памяти, используя chunk:

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

. При этом происходит выборка только 100 (вы можете выбрать любое число здесь) за раз в памяти(против Activity::all(), который загружает каждое действие в память одновременно; если это миллионы строк, вы можете легко понять, почему вы получаете ошибку памяти).

0 голосов
/ 12 октября 2018

Более «красноречивое» решение (и, вероятно, более перспективное для будущего)

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

Это извлекает конструктор запросов для модели Activity без ограничений, поэтому delete () будет применяться ко всем.Он не загружает все действия, а удаляет их за один вызов.Он также не показывает никаких знаний о внутренней работе программных удалений, что предпочтительно для прямой совместимости.

0 голосов
/ 12 октября 2018

Если есть много действий, это может потенциально генерировать огромное количество запросов.Это можно сделать одним запросом, например, так:

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

softdeletes использует столбец deleted_at для проверки удаления строки.Поэтому установка столбца вручную для всех строк дает одинаковый эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...