2015-07-16 14 views
15

मुझे और सेवाएं तालिका प्रदान करता है।लैरवेल 5: कैस्केड सॉफ्ट डिलीट

सेवा (ओं) एक प्रस्ताव का बच्चा है। अब तक मैंने प्रस्ताव को नरम हटाने के लिए कार्यक्षमता स्थापित की है। मैं संलग्न सेवाओं को नरम कैसे हटाऊंगा?

प्रवासन ऑफर

Schema::create('offers', function(Blueprint $table) 
{ 
    $table->increments('id')->unsigned(); 
    ...  
    $table->timestamps(); 
    $table->softDeletes(); 
}); 

प्रवासन सेवा

Schema::create('services', function(Blueprint $table) 
{ 
    $table->increments('id'); 
    $table->integer('offer_id')->unsigned(); 
    ... 
    $table->timestamps(); 
    $table->softDeletes(); 
}); 

Schema::table('services', function($table) 
{ 
    $table->foreign('offer_id') 
      ->references('id') 
      ->on('offers'); 
}); 

मॉडल ऑफर

use SoftDeletes; 
protected $dates = ['deleted_at']; 

public function services() { 
    return $this->hasMany('App\Service'); 
} 

मॉडल सेवा

public function offer() { 
    return $this->belongsTo('App\Offer'); 
} 
012: यहाँ मेरी कोड है

हटाएँ विधि

public function destroy($id) 
{ 
    $offer = Offer::find($id); 
    $offer->delete(); 
} 

सभी मदद के लिए धन्यवाद।

उत्तर

23

मैं प्रस्ताव मॉडल में इस कोड डाल दिया है:

protected static function boot() { 
    parent::boot(); 

    static::deleting(function($offer) { 
     $offer->services()->delete(); 
    }); 
} 

और सेवा मॉडल में लापता

use SoftDeletes; 
protected $dates = ['deleted_at']; 

गयी।

+2

लेकिन यह समाधान काम नहीं करता है अगर सेवाओं में एफके है ... बच्चे के मॉडल में हटाना ट्रिगर नहीं किया गया है –

+0

मैं दीवार के खिलाफ अपने सिर को टक्कर दे रहा हूं कि यह मेरे लिए क्यों काम नहीं करता .. पता चला क्योंकि यह इसलिए था क्वेरी को डिलीट कॉल करते समय यह 'हटाना' और 'हटाए गए' तरीकों को कॉल नहीं करता है। यहां कुछ और विवरण और उदाहरण हैं कि इसे कैसे काम करें: https: // github।कॉम/लार्वेल/ढांचे/मुद्दों/2536 # अंकन -74557441 –

4

इसके लिए आपको Eloquent events का उपयोग करना चाहिए।

Offers::deleted(function($offer) { 
    $offer->services()->delete(); 
}); 

Offers::restored(function($offer) { 
    $offer->services()->withTrashed()->restore(); 
}); 
+0

आपके ef के लिए धन्यवाद किला। मैंने इस कोड को नीचे मेरी डिलीट विधि में डालने का प्रयास किया है लेकिन सेवाएं अभी भी डेटाबेस में बनी हुई हैं। क्या मुझे अपने बारे में कुछ लिखना है? –

+0

कोई जवाब के साथ कोई भी? धन्यवाद। –

1

आप ऐसा कर सकते हैं।

self::deleting(function($offer) { 
    $offer->services()->delete(); 
}); 

self::restoring(function ($offer) { 
    $offer->services()->restore(); 
}); 

आपको पहले माता-पिता (ऑफ़र) को हटाने/पुनर्स्थापित करने से पहले बच्चों के रिकॉर्ड (सेवाओं) को हटा/पुनर्स्थापित करना चाहिए। ऐसा करने में विफल, रेफरेंसियल अखंडता MySQL त्रुटि को ट्रिगर करेगा।

+2

यह एक अखंडता त्रुटि को ट्रिगर नहीं कर सकता क्योंकि रिकॉर्ड केवल नरम हटा दिए जाते हैं। हालांकि, आप बच्चों को बहाल करने से पहले माता-पिता को पुनर्स्थापित करेंगे। तो 'स्वयं :: पुनर्स्थापित' का उपयोग करें। – halloei

1

आप मैं अत्यधिक इस लाइब्रेरी का उपयोग की सलाह देते हैं अपने सुवक्ता मॉडल में softDeletes व्यापक प्राप्त करना चाहते हैं iatstuti/laravel-cascade-soft-deletes

संगीतकार

// get it with composer. 
$ composer require iatstuti/laravel-cascade-soft-deletes="1.0.*" 

त्वरित उदाहरण (आने शुरू हो गए नमूने में प्रदान की जाती है)

<?php 

namespace App; 

use App\Comment; 
use Iatstuti\Database\Support\CascadeSoftDeletes; 
use Illuminate\Database\Eloquent\Model; 
use Illuminate\Database\Eloquent\SoftDeletes; 

class Post extends Model 
{ 
    use SoftDeletes, CascadeSoftDeletes; 

    protected $cascadeDeletes = ['comments']; 

    protected $dates = ['deleted_at']; 

    public function comments() 
    { 
     return $this->hasMany(Comment::class); 
    } 
} 
संबंधित मुद्दे