2015-11-11 1 views
2

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

Когда я хочу сохранить модель, я клонирую ее, удаляю исходную модель и сохраняю клон. Таким образом, я могу видеть каждое изменение модели во времени.

Что бы я хотел сделать, есть логика, встроенная в саму модель, которая имитирует это поведение при вызове простой модели -> save().

Это можно сделать?

ответ

1

Вы можете использовать события, чтобы сделать это, конечно. На модели, что-то вроде:

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 события. Я сделал это целенаправленно, чтобы вы могли клонировать модель до того, как ее данные будут обновлены (либо путем повторной загрузки модели из базы данных, либо с использованием исходных данных, хранящихся в модели), а затем модель не будет удалена до тех пор, пока она не будет обновлена ​​и сохраненный в базе данных, дающий вам образец, который, кажется, вы пытаетесь достичь.

Для записи, однако, мне не нравится этот стиль управления версиями. Откуда вы знаете, действительно ли запись была удалена или является только историческим элементом? Также сложно объяснить изменения в отношениях, используя этот метод. Я бы предпочел стиль журнала (где вы сохраняете сериализованный список значений, которые были изменены, и преобразовывайте их по мере необходимости). Это приведет к меньшему количеству данных в самой базе данных (поскольку в идеале вы только сохранили измененные столбцы), более четко определенную структуру данных и все ваши зарегистрированные обновления в центральной таблице, которые управляются полиморфными отношениями.

Если вы хотите сделать это по-своему, я думаю, что лучший маршрут - клонировать вашу модель и удалять клон. Я думаю, этот способ был бы менее разрушительным для пользователя, поскольку идентификаторы и т. Д. Не будут постоянно меняться и, возможно, устаревают для других пользователей. Независимо от того, я бы предпочел сделать сериализованный список.

1

Мне нравится ответ Джоша, особенно isDirty проверка. Одно из основных изменений, которые я хотел бы предложить, - создать отдельную таблицу базы данных и отдельную модель. Назовите таблицу суффиксом _revisions, а затем вы можете даже иметь отношение, чтобы легко получить ревизии для этой модели.

Например, если ваша организация была вызвана Post, то таблица post_revisions должна быть идентичной, за исключением дополнительного столбца post_id, который ссылается на исходную модель.

class PostRevision { 
    protected $table = 'post_revisions'; 

    public function post() { 
     return $this->belongsTo(Post::class); 
    } 
} 

class Post { 
    protected $table = 'posts'; 

    public function revisions() { 
     return $this->hasMany(PostRevision::class); 
    } 
} 

Теперь ваша таблица сообщений не завален ненужных изменений

 Смежные вопросы

  • Нет связанных вопросов^_^