2014-11-27 27 views
6

È possibile revisionare le modifiche alle relazioni uno-a-molti? Ad esempio:Modelli revisionabili Laravel con relazione uno-a-molti

Modello: Utente. Modello: post. Il modello utente utilizza Venturecraft \ Revisionable \ RevisionableTrait; e hanno una relazione MOLTA con i messaggi. Se un post viene aggiunto o aggiornato, può essere tracciato da revisionabile sotto l'Utente a cui appartiene il post?

Grazie in anticipo

risposta

1

ero in grado di tirar fuori qualcosa. Tuttavia non è la soluzione più elegante, quindi sarebbe bello se qualcuno mi aiutasse a ripulirlo (specialmente se unset non mi dà fastidio).

La mia soluzione creerà i duplicati nella tabella a cui appartiene il modello. Non so se questo è ciò che si voleva

La prima cosa che devi fare è quello di aggiungere una colonna nullable datetime revision_at nella tabella appropriata.

Il tratto stesso è piuttosto semplice. Facciamo uso del metodo boot() per registrare l'evento updating dei modelli. Si attiverà ogni volta che un modello sta per essere aggiornato. Questo è esattamente ciò di cui abbiamo bisogno, dal momento che non vogliamo una revisione la prima volta che creiamo il modello.

<?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(); 

     }); 


    } 

} 

L'unica cosa che facciamo è quello di afferrare il modello originale prima che i nuovi campi sono stati assegnati, non impostato l'id per assicurarsi che non creiamo una voce duplicata, impostare l'ora corrente per il campo e revision_at salva il modello.

Questo è praticamente.

può essere tracciato da revisione sotto l'utente cui appartiene il post?

questo viene fatto automaticamente dal momento che il nuovo modello di revisione appartiene ancora al rispettivo utente,

Se si vuole mettere a punto che si potrebbe creare un tavolo dedicato per le revisioni in cui è memorizzato un riferimento al modello . Tuttavia, la memorizzazione delle proprietà potrebbe risultare un po 'più difficile (forse è possibile memorizzarle in serie).

Un altro possibile miglioramento potrebbe essere la modifica dei metodi getter del modello nel tratto. Ad esempio, lasciare all() restituire solo i modelli che non sono revisioni. Quindi aggiungi un metodo withRevisions() per prenderli anche tu. È possibile estrarre la logica da essa se si guarda come Laravel gestisce le eliminazioni software. È esattamente lo stesso.

Problemi correlati