2013-06-21 28 views
6

L4'te basamaklı yumuşak silme işlemleri yapmak için modüler bir yol var mı?Laravel 4 Cascading Soft Deletes

Veritabanım zaten tüm sınamalar bir diğeriyle ilgili olduğundan sert silme işlemleriyle bunu yapmak için tasarlandı .. ancak, yumuşak silmeler kullanıyorum ve modellerde delete() yöntemini aşırı yüklemek zorunda kalmak istemiyorum. (A) modellerin miktarı ve (B) diğer modeller değiştiğinde tüm modellerde delete() yöntemini düzenlemek zorundadır.

Herhangi bir işaretçi veya ipucu takdir edilecektir.

cevap

2

bu benim modelleri içinden mümkündür biliyoruz:

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

Fakat modelleri veya masa yapısına herhangi güncel bilgiler bu diğer modeller de dahil olmak .. düzenlenebilir/eklenecek neden olur.

+0

bu bir cevap veya soru parçası mı ? –

+1

Her ikisi: Silme işlemini elle düzenlemek için bir yol gösterir (veya child_id üst tabloları yeniden atar). Ancak, böyle bir silmenin modüler bir yolu hoş olurdu; Eloquent'in ilişkilerle nasıl çalıştığı gibi. Demek istediğim .. ilişkiler zaten var, o zaman neden tanımlanmış ilişkilerde basamaklı yumuşak silme yapmayı denemiyorsunuz? –

+0

http://stackoverflow.com/a/14176326/3986937 as @Chris Schmitz, bu davranışı geçişlerinize ekleyebileceğinizi belirtti. – Logus

10

Ben bütün ilişkileri yumuşak silebilirsiniz yüzden silinen olaya bağlanan bir ürün modelinde örneğin model events kullanarak çalışan siler, basamaklı var:

// 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 ayrıca, Model :: deleting() ve Model :: deleted() işleyicilerini kullanmak için [https://github.com/laravel/framework/issues/357#issuecomment-15470365] önerilerini ( –

+0

Chris Schmitz, bu davranışı göçlerinize ekleyebilirsiniz http://stackoverflow.com/a/14176326/3986937 – Logus