2013-06-21 17 views
6

Esiste un modo modulare per eseguire eliminazioni a cascata in L4?Laravel 4 Elimina soft cascade

Il mio database è già progettato per eseguire questa operazione con eliminazioni complesse perché tutte le tabelle sono correlate a un altro. Tuttavia, sto utilizzando le eliminazioni software e non voglio sovraccaricare il metodo delete() nei miei modelli - semplicemente dovuto a (A) la quantità di modelli, e (B) dover modificare il metodo delete() in tutti i modelli quando cambiano altri modelli.

Qualsiasi suggerimento o suggerimento sarebbe apprezzato.

risposta

2

so questo è possibile dal di dentro i miei modelli:

public function delete() { 
    ChildTable::where('parent_id', $this->id)->delete(); 
    ChildTable2::where('parent_id', $this->id)->delete(); 
    parent::delete(); 
} 

Ma qualsiasi aggiornamento di modelli o struttura della tabella potrebbe causare questo da aggiungere/a cura .. compresi gli altri modelli.

+0

E' una risposta o parte della tua domanda ? –

+1

Entrambi: Rappresenta un modo per eliminare in cascata manualmente (o riassegnare le tabelle padre child_id). Tuttavia, un modo modulare di tale cancellazione sarebbe bello; come il modo in cui Eloquent lavora con le relazioni. Voglio dire ... le relazioni sono già lì, quindi perché non tentare di eseguire eliminazioni soft a cascata sulle relazioni definite? –

+0

http://stackoverflow.com/a/14176326/3986937 come ha sottolineato @Chris Schmitz, è possibile aggiungere questo comportamento nelle migrazioni. – Logus

10

Ho le eliminazioni alla catena di lavoro utilizzando model events, per esempio, in un modello del prodotto mi legano alla manifestazione cancellato in modo da poter soft-eliminare tutti i rapporti:

// Laravel's equivalent to calling the constructor on a model 
    public static function boot() 
    { 
     // make the parent (Eloquent) boot method run 
     parent::boot();  

     // cause a soft delete of a product to cascade to children so they are also soft deleted 
     static::deleted(function($product) 
     { 
      $product->images()->delete(); 
      $product->descriptions()->delete(); 
      foreach($product->variants as $variant) 
      { 
       $variant->options()->delete(); 
       $variant->delete(); 
      } 
     }); 
    } 
+1

Taylor [consiglia] (https://github.com/laravel/framework/issues/357#issuecomment-15470365) per utilizzare i gestori Model :: delete() e Model :: deleted() –

+0

Chris Schmitz ha sottolineato che puoi aggiungere questo comportamento nelle tue migrazioni http://stackoverflow.com/a/14176326/3986937 – Logus