2014-11-27 3 views
6

Возможно ли редактируемое отслеживать изменения отношений «один ко многим»? Например:Редактируемые модели Laravel с отношением «один ко многим»

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

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

ответ

1

я был в состоянии придумать что-нибудь. Однако это не самое изящное решение, так что было бы здорово, если бы кто-нибудь помог мне очистить его (особенно это неудобно беспокоит меня).

Мое решение создаст дубликаты в таблице, к которой принадлежит модель. Я не знаю, если это то, что вы хотели

Первое, что вам нужно сделать, это добавить обнуляемого 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. Это точно то же самое.

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