Вы можете использовать события, чтобы сделать это, конечно. На модели, что-то вроде:
protected static function boot() {
parent::boot();
self::saving(function (Model $model) {
if ($model->isDirty()) {
// clone the $model here
}
});
self::saved(function (Model $model) {
if ($model->isDirty()) {
// delete the model here
}
});
}
Вы заметите, я использую оба saving
и saved
события. Я сделал это целенаправленно, чтобы вы могли клонировать модель до того, как ее данные будут обновлены (либо путем повторной загрузки модели из базы данных, либо с использованием исходных данных, хранящихся в модели), а затем модель не будет удалена до тех пор, пока она не будет обновлена и сохраненный в базе данных, дающий вам образец, который, кажется, вы пытаетесь достичь.
Для записи, однако, мне не нравится этот стиль управления версиями. Откуда вы знаете, действительно ли запись была удалена или является только историческим элементом? Также сложно объяснить изменения в отношениях, используя этот метод. Я бы предпочел стиль журнала (где вы сохраняете сериализованный список значений, которые были изменены, и преобразовывайте их по мере необходимости). Это приведет к меньшему количеству данных в самой базе данных (поскольку в идеале вы только сохранили измененные столбцы), более четко определенную структуру данных и все ваши зарегистрированные обновления в центральной таблице, которые управляются полиморфными отношениями.
Если вы хотите сделать это по-своему, я думаю, что лучший маршрут - клонировать вашу модель и удалять клон. Я думаю, этот способ был бы менее разрушительным для пользователя, поскольку идентификаторы и т. Д. Не будут постоянно меняться и, возможно, устаревают для других пользователей. Независимо от того, я бы предпочел сделать сериализованный список.