2014-11-27 5 views
6

일일 관계의 변경 내용을 리비전 가능으로 추적 할 수 있습니까? 예 :일대 다 관계가있는 Laravel 리비전 모델

모델 : User : 모델 : 게시물. 사용자 모델은 Venturecraft \ Revisionable \ RevisionableTrait를 사용합니다. 게시물에 hasMany 관계가 있습니다. 게시물이 추가 또는 업데이트 된 경우 해당 게시물이 속한 사용자의 수정 가능 항목으로 추적 할 수 있습니까?

미리 감사드립니다.

답변

1

나는 뭔가를 생각해 냈습니다. 그러나 그것은 가장 우아한 해결책이 아니므로 누군가가 나를 청소하도록 도울 수 있다면 좋을 것입니다. 특히 미안해하는 것이 나를 귀찮게합니다.

내 솔루션은 모델이 속한 테이블에 중복을 만듭니다. 이게 당신이 원하는 것인지 모르겠습니다.

가장 먼저해야 할 일은 nullable datetime 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(); 

     }); 


    } 

} 

여기서 우리가 할 수있는 유일한 방법은 새로운 분야가 할당되기 전에 우리가 중복 항목을 작성하지 않도록하기 위해 해제, ID를 원래 모델을 잡아되면, revision_at 필드의 현재 시간을 설정하고 모델을 저장하십시오.

그건 기본적입니다.

게시자가 속한 사용자의 개정판을 통해 추적 할 수 있습니까? 새로운 버전 모델은 여전히 ​​각각의 사용자에 속하기 때문에

자동

당신이 미세 조정을 할 당신이 모델에 대한 참조가 저장되는 개정을위한 전용 테이블을 만들 수 원하는 경우, 완료 . 그러나 속성을 저장하는 것이 조금 어려워 질 수 있습니다 (어쩌면 직렬화 할 수 있습니다).

또 다른 가능한 개선점은 특성에서 모델의 게터 메소드를 수정하는 것입니다. 예를 들어 all()은 수정 버전이없는 모델 만 반환합니다. 그런 다음 withRevisions() 메서드를 추가하여 가져옵니다. Laravel이 Soft Deletes를 처리하는 방법을 살펴 본다면 논리를 추출 할 수 있습니다. 그것은 정확히 같습니다.

관련 문제