Очистка данных в таблице?

#laravel #laravel-5 #laravel-5.7

#laravel #laravel-5 #laravel-5.7

Вопрос:

Вот упрощенная версия того, что происходит:

  1. Пользователь заполняет форму.

  2. При сохранении формы идентификатор строки сохраняется в сеансе.

  3. Затем пользователь входит в систему.

  4. Событие входа пользователя в систему перехватывается, и правильная строка (идентификатор, взятый из сеанса) затем обновляется идентификатором пользователя.

Теперь, если пользователь выполняет только шаги 1 и 2, а затем прекращает процесс, потому что не хочет входить в систему, в базе данных остаются строки данных, не приписанные пользователю.

Мне нужно удалить эти строки.

Какой был бы наилучший способ добиться этого?

  1. Есть ли способ выполнить транзакцию базы данных, которая выполняется по запросам, чтобы ее можно было запускать до входа в систему и фиксировать после входа в систему?

  2. Был бы лучшим сценарий очистки, запускаемый так часто, который не находил бы строк, приписываемых пользователю, и удалял бы их?

Или есть другой способ?

Комментарии:

1. Лично я бы выбрал решение «сценарий очистки». Просто напишите облегченную команду и выполняйте if каждые 30 минут / 1 час, добавив ее в ядро вашей консоли.

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

3. Есть ли какая-либо причина, по которой вы не можете сохранить все данные формы в сеансе между шагом 1 и шагом 2?

4. @panthro Да, не рекомендуется хранить слишком много данных в сеансе. Тем не менее, вы можете сохранить свои данные во временном файле (взгляните на метод sys_get_temp_dir ), а затем сохранить путь к вашему файлу в сеансе.

5. Что-то, что следует учитывать, хотя я сомневаюсь, что это часто произойдет, но если сценарий будет выполняться между пользователем, отправляющим форму, и входом в систему, не приведет ли это к удалению их строки? Возможно, вы захотите запускать его каждый час и удалять только 60 минут назад, чтобы попытаться предотвратить это.

Ответ №1:

Я бы создал скрипт очистки с помощью планировщика, см. Основную идею ниже:

 // appConsoleKernel.php

protected function schedule(Schedule $schedule)
    {
        $schedule->call(function () {
            // Query all records that havent changed in an x-amount of time
            // and remove them.
        })->everyDay();
    }
  

Затем вы просто добавляете следующий CRON-скрипт на свой сервер:

 * * * * * cd /path-to-your-project amp;amp; php artisan schedule:run >> /dev/null 2>amp;1
  

И помощник Artisan будет вызывать ваш планировщик каждую минуту и запускать каждую задачу в зависимости от ее интервала.

Поскольку вы не можете сказать, вернется ли пользователь когда-нибудь, включая тот факт, что сеанс Laravel, скорее всего, очистится очень скоро (время жизни по умолчанию составляет 120 минут, я полагаю), не будет никакого другого триггера для удаления определенной записи из вашей базы данных.