2013-06-21 14 views
6

L4でカスケードソフト削除を実行するモジュラ方法はありますか?Laravel 4カスケーディングソフト削除

私のデータベースは、すべてのテーブルが別のテーブルに関連付けられているため、ハード削除でこれを行うように既に設計されています。しかし、私はソフト削除を使用していて、実際にはモデル内でdelete()メソッドをオーバーロード(A)モデルの量、および(B)他のモデルが変更されたときにすべてのモデルでdelete()メソッドを編集する必要があります。

何か指摘やヒントをいただければ幸いです。

答えて

2

私はこれが私のモデルの中から可能です知っていますか:

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

しかし、モデルやテーブル構造への更新は、これは他のモデルを含む。..、編集/追加される原因となります。

+0

がこの回答やご質問の一部ですが? –

+1

両方:手動でカスケード削除する(または親テーブルchild_idを再割り当てする)方法を表します。しかし、そのような削除のモジュール的な方法はいいでしょう。 Eloquentがどのように関係で動作するかなど、私は..関係はすでにそこにあるので、定義された関係でカスケードソフト削除を実行しようとしないでください。 –

+0

http://stackoverflow.com/a/14176326/3986937 @Chris Schmitz氏は、移行でこの動作を追加できると指摘しました。 – Logus

10

私はすべての関係のソフト削除することができますので、私は削除したイベントにバインドする製品モデルに例えばmodel eventsを使用して作業を削除し、カスケード持っている:

// 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はModel :: deleted()とModel :: deleted()ハンドラを使用するには[推奨](https://github.com/laravel/framework/issues/357#issuecomment-15470365) –

+0

Chris Schmitzは、移行でこの動作を追加できますhttp://stackoverflow.com/a/14176326/3986937 – Logus

関連する問題