2016-07-09 41 views
1

Mein aktuelles Modell hat einige Relationen. Wie kann ich sie auch löschen, wenn das Modell gelöscht wird? Diese Abfrage löscht nicht die zugehörigen Modelle, sondern nur das 'Hauptmodell'.laravel5.2 Modell mit allen Relationen löschen

Ich benutze diesen Code zu nennen:

$checks = Check::where('created_at','<=', Carbon::now() 
       ->subHours(3)) 
       ->with('checks') 
       ->with('results') 
       ->delete(); 

Hier ist mein aktuelles Modell von Check

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

    static::deleting(function($check) { 
     $check->checks()->delete(); 
     $check->results()->delete(); 
    }); 
} 

Ergebnisse und Kontrollen enthalten mehr als einen Eintrag für jeden Scheck. Bedeutet dies, um die Dinge klar zu stellen:

Ein Scheck kann n CheckResult haben und n CheckProcedure haben (ich werde natürlich alle von ihnen auch löschen).

+0

Sie rufen 'löschen' auf einem Abfrage-Generator, nicht das Modell. Wenn Sie möchten, dass ein Modellereignis ausgelöst wird, müssen Sie das Modell aufrufen. auch nicht sicher, wofür das eifrige Laden ist, wenn Sie gerade eine delete-Anweisung auf der db ausführen. – lagbox

Antwort

1

Versuchen deleted statt deleting zu verwenden:

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

    static::deleted(function($check) 
    { 
     $check->checks()->delete(); 
     $check->results()->delete(); 
    }); 
} 

auch versuchen, aus zurücker Sammlung Objekt für Objekt zu analysieren:

foreach($check->checks as $check_object) { 
    $check_object->delete(); 
} 

Hoffnung, das hilft.

+0

Ich aktualisierte Code oben, funktioniert nicht. Nur das Hauptmodell wird gelöscht. –

+0

Stellen Sie sicher, dass die Methode durch Hinzufügen von 'dd()' oder 'log' innerhalb ausgelöst wird. –

0

Wie bereits in den Kommentaren erwähnt, führen Sie das Löschen für einen Abfrage-Generator statt der tatsächlich verwandten Modelle durch. das heißt

sollten Sie

$check->checks->delete(); 
$check->results->delete(); 

haben statt dessen, was Sie im Moment haben.

Darüber hinaus ist der richtige Weg, dies unter der Annahme, dass Sie eine relationale Datenbank verwenden, foreign keys with cascade delete action zu verwenden.

+0

Code oben erneut bearbeitet. Funktioniert auch nicht. –

+0

Sie suchen nicht. 'checks-> delete()' not 'checks() -> delete()' –