2017-12-05 3 views
1

Ich habe ein Turnier-Modell, das eine belongsToMany Beziehung mit einem Session-Modell enthält:Laravel löschen Sie alle belongsToMany Beziehungen in belongsToMany Beziehung

class Tournament extends Model{ 

    public function sessions(){ 
     return $this->belongsToMany(Session::class, 'tournament_has_sessions'); 
    } 
} 

meine Sitzungen Modell Dann enthält eine belongsToMany Beziehung mit dem User-Modell:

class Session extends Model{ 

    public function users(){ 
     return $this->belongsToMany(User::class, 'session_has_users'); 
    } 

} 

Wenn ich jetzt ein Turnier lösche, möchte ich alle Sitzungen und alle Informationen in der Tabelle session_has_users damit löschen.

Ich habe versucht:

$tournament->sessions()->with('users')->delete(); -- < This 
$tournament->sessions()->delete(); 
$tournament->users()->detach(); 
$tournament->delete(); 

Aber es does 't Arbeit. Die Daten in der Tabelle session_has_users weiterhin bestehen

Ich weiß, ich so etwas tun könnte:

DB::table('session_has_users')->whereIn('session_id', $this->sessions()->pluck('id'))->delete(); 

Aber ist es eine effizientere/handlich (oder sogar Alternative, wenn nicht effizienter) Weg, dies zu erreichen?

Antwort

2

Verwendung von RDBMS Referentielle Aktionen auf dem Foreign Key

Im Datenbankschema, sollten Sie den Fremdschlüssel mit der ON DELETE CASCADE Aktion definieren. Dadurch werden die verknüpften Datensätze automatisch gelöscht, wenn die referenzierte ID gelöscht wird.

(dbudimir Antwort für die Beispielzeilen aus einer Laravel Migration Datei anzeigen)


Eloquent mit allen Verwandten Modelle lösen

Wenn Sie keine Fremdschlüssel verwenden oder Ihre Datenbank fehlt die Unterstützung für referenziellen Aktionen, können Sie diese verwenden:

$tourament->sessions()->sync([]); 

Die Synchronisierungsmethode akzeptiert ein Array von IDs, die in der Zwischentabelle platziert werden sollen. Alle IDs, die nicht im angegebenen Array enthalten sind, werden aus der Zwischentabelle entfernt. So, nachdem dieser Vorgang abgeschlossen ist, werden nur die IDs in der gegebenen Array wird in der Zwischentabelle vorhanden sein:

https://laravel.com/docs/5.5/eloquent-relationships#updating-many-to-many-relationships

Providing ein leeres Array sollte dann alle Beziehungen entfernen.

+0

Vielen gesetzt, ich glaube, ich aussehen In der referenziellen Aktion ON DELETE CASCADE sprechen Sie von – Joas

3

In der Tabelle ‚tournament_has_sessions‘ Sie onDelete (‚Kaskade‘) wie folgt

$table->integer('tournament_id')->unsigned()->nullable(); 
$table->foreign('tournament_id')->references('id')->on('tournaments')->onDelete('cascade');  
$table->integer('session_id')->unsigned()->nullable(); 
$table->foreign('session_id')->references('id')->on('sessions')->onDelete('cascade'); 

Und wenn löschen Turniere gelöscht automatisch alle Datensätze in dieser Tabelle Sie

+0

+1. So legen Sie eine referenzielle ON DELETE CASCADE-Aktion in einer Laravel-Migrationstabellendefinition fest. Wenn Sie derzeit keinen Fremdschlüssel haben, die Tabelle jedoch bereits migriert wurde, ignorieren Sie die Ganzzahlzeilen. – Devon

Verwandte Themen