2017-05-02 3 views
0

ich eine Erinnerung Tabelle, die eine Eins-zu viele Beziehung auf sich hat, , so habe ich diese Tabelle:
id: Primärschlüssel
reminder_id: meine Fremdschlüssel zu Erinnerung Tabelle
, so dass ich einen Datensatz mit Schlüssel id=1 haben könnte, und viele andere Datensätze, die sich darauf beziehen mit reminder_id=1.Laravel 5.4 Detach Rekord von Pivot auf löschen

Ich habe auch eine Benutzer-Tabelle, mit seiner ID, und eine reminder_user zu viele Beziehung zu hanlde.
Die Beziehung funktioniert gut, so dass vom Benutzer kann ich seine Erinnerungen abrufen, aus einer Erinnerung seiner Kinder Erinnerung und so weiter.

Das Erinnerung Modell:

class Reminder extends Model { 

    public function users() { 
     return $this->belongsToMany("App\Models\User"); 
    } 

    public function reminder() { 
     return $this->belongsTo("App\Models\Reminder"); 
    } 

    public function reminders() { 
     return $this->hasMany("App\Models\Reminder"); 
    } 

} 

Das Benutzer Modell:

class User extends Authenticatable 
{ 
    use Notifiable; 

    public function reminders() { 
     return $this->belongsToMany("App\Models\Reminder"); 
    } 
} 

Mein Problem ist, dass, wenn ich eine Erinnerung aktualisieren, wird der Datensatz in meiner Pivot-Tabelle reminder_user wird nicht gelöscht .

Ich habe versucht, diesen Beobachter zu erstellen:

namespace App\Observers; 

use App\Models\Reminder; 

class ReminderObserver { 
    public function deleting(Reminder $reminder) 
    { 
     $reminder->users()->detach(); 
    } 
} 

und an den appservice Anbieter hinzugefügt:

public function boot() 
{ 
    //... 
    Reminder::observe(ReminderObserver::class); 
} 

aber bisher werden die Datensätze in reminder_user Tabelle nicht gelöscht werden, wenn ich tun diese Transaktion:

DB::transaction(function()use($reminder, $repeated, $user) { 
     //delete old reminders 
     $reminder->reminders()->delete(); 
     //add many new reminders 
     $reminder->reminders()->saveMany($repeated); 
     //save new relation with user 
     $user->reminders()->saveMany($repeated); 
     //update current reminder 
     $reminder->save(); 
    }); 

Update

Wie von der Antwort ist das Problem, dass das Aufrufen von delete() auf dem Abfrage-Generator die Modellbeobachter nicht auslöst.

+0

Mögliche Duplikat [Laravel Eloquent ORM - viele zu viele Delete Pivot-Tabelle Werte übrig] (http://stackoverflow.com/questions/27330551/laravel-eloquent-orm-many-to-many-delete-pivot-table-values-left-over) – Spholt

Antwort

3

Modellbeobachter werden nur aufgerufen, wenn die Aktion für das Modell ausgeführt wird.

Ihr löschen Aufruf:

//delete old reminders 
$reminder->reminders()->delete(); 

Dies ruft delete() auf dem Query Builder, so dass die Modelle nicht erstellt werden, und deshalb die Modell Beobachter nicht ausgelöst werden. Sie müssen jedes Modell laden und auf sie einzeln löschen, um rufen Sie für Ihr Modell Beobachter auslösen:

//delete old reminders 
$reminder->reminders()->get()->each(function ($child) { 
    $child->delete(); 
}); 
+0

Das funktioniert, danke. Nur eine Anmerkung: Erstens fehlte die '$ event' Definition im Erinnerungsmodell:' protected $ events = ['löschend' => ReminderObserver :: class]; ' Zweitens: Ich brauchte ein' composer dump-autoload' für die Beobachter gefunden werden. – GiuServ