я был в состоянии придумать что-нибудь. Однако это не самое изящное решение, так что было бы здорово, если бы кто-нибудь помог мне очистить его (особенно это неудобно беспокоит меня).
Мое решение создаст дубликаты в таблице, к которой принадлежит модель. Я не знаю, если это то, что вы хотели
Первое, что вам нужно сделать, это добавить обнуляемого DateTime revision_at
столбец в соответствующей таблице.
Характеристика сама по себе довольно проста. Мы используем модели boot()
метод регистрации моделей updating
event. Он будет срабатывать всякий раз, когда модель собирается обновиться. Это именно то, что нам нужно, так как мы не хотим пересмотра в первый раз, когда мы создаем модель.
<?php
trait RevisionableTrait {
public static function boot()
{
parent::boot();
static::updating(function($model){
// Grab the original Model and unset the id
// from it, so that we don't get duplicate
// entries when we create a new model.
$attributes = $model->getOriginal();
unset($attributes['id']);
// Next we need to add the date the revision
// was created
$attributes['revision_at'] = new DateTime();
$revision = new static($attributes);
$revision->save();
});
}
}
Единственное, что мы делаем здесь, чтобы захватить оригинальную модель, прежде чем новые поля были назначены, незадана идентификатор, чтобы убедиться, что мы не создаем дубликат записи, установить текущее время для revision_at
поля и сохранить модель.
Это все в основном.
можно ли отслеживать его под редакцией под пользователем, к которому принадлежит сообщение?
Это происходит автоматически, так как новая модель пересмотра еще принадлежит к соответствующему пользователю,
Если вы хотите, чтобы точно настроить его можно создать специальную таблицу для ревизий, ссылка на модель хранится , Однако сохранение свойств может стать немного сложнее (возможно, вы можете хранить их в сериализованном виде).
Другим возможным усовершенствованием было бы изменение методов геттера модели в признаке. Например, пусть all()
только возвращают модели, которые не являются ревизиями. Затем добавьте метод withRevisions()
, чтобы захватить их. Вы можете извлечь из нее логику, если вы посмотрите, как Laravel обрабатывает Soft Deletes. Это точно то же самое.