Возможно ли редактирование для отслеживания изменений в отношениях один-ко-многим? Например:
Модель: Пользователь.
Модель: посты. Пользовательская модель использует Venturecraft \ Revisionable \ RevisionableTrait; и имеет много отношений с сообщениями. Если сообщение добавлено или обновлено, может ли это быть отредактировано пользователем, которому принадлежит сообщение?
заранее спасибо
Я был в состоянии что-то придумать. Однако это не самое элегантное решение, так что было бы замечательно, если бы кто-нибудь помог мне убрать это (особенно, если unset беспокоит меня).
Мое решение создаст дубликаты в таблице, к которой принадлежит Модель. Я не знаю, если это то, что вы хотели
Первое, что вам нужно сделать, это добавить обнуляемую дату и время revision_at
столбец в соответствующей таблице.
Сама черта довольно проста. Мы используем модели boot()
способ регистрации моделей updating
событие. Он будет срабатывать всякий раз, когда модель собирается обновить. Это именно то, что нам нужно, так как мы не хотим пересмотра в первый раз, когда мы создаем модель.
<?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. Это точно так же.
почему бы не использовать это?
$user = User::first();
$user->posts->map(function($post) {
return $post->revisionHistory;
});