Ревизионные модели Laravel с отношением один ко многим

Возможно ли редактирование для отслеживания изменений в отношениях один-ко-многим? Например:

Модель: Пользователь.
Модель: посты. Пользовательская модель использует Venturecraft \ Revisionable \ RevisionableTrait; и имеет много отношений с сообщениями. Если сообщение добавлено или обновлено, может ли это быть отредактировано пользователем, которому принадлежит сообщение?

заранее спасибо

6

Решение

Я был в состоянии что-то придумать. Однако это не самое элегантное решение, так что было бы замечательно, если бы кто-нибудь помог мне убрать это (особенно, если 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. Это точно так же.

1

Другие решения

почему бы не использовать это?

$user = User::first();
$user->posts->map(function($post) {
return $post->revisionHistory;
});
0

По вопросам рекламы [email protected]