Laravel Soft-Deletes

Inhaltsverzeichnis

Was ist ein Soft Delete in Laravel?

Soft Delete („weiches Löschen“) bedeutet, dass ein Datensatz oder mehrere Datensätze nicht wirklich „physikalisch“ aus der Datenbank gelöscht werden. Stattdessen werden diese Datensätze nur als gelöscht markiert, und können bei Bedarf wieder hergestellt werden.

In Laravel funktioniert das so, dass die entsprechende Datenbanktabelle um ein Feld „deleted_at“ ergänzt wird. Dieses Feld ist vom Typ Timestamp. Laravel kann also später auch erkennen WANN ein Datensatz „Soft-Deleted“ wurde.
Sobald ein Soft-Delete auf einen Datensatz durchgeführt wurde, schreibt Laravel den aktuellen Timestamp (Datum und Uhrzeit) in das Feld.

Wie legt man Soft-Deletes in Laravel an?

Um einer Datenbanktabelle bzw. einem Model in Laravel die Möglichkeit zu geben Soft-Deletes zu nutzen sind nur 2 Schritte notwendig:

Schritt 1: Migration erweitern

In das Migrationsfile der Tabelle fügst du einfach ein: $table->softDeletes();

Wenn du jetzt die Migration laufen lässt: php artisan migrate:fresh
dann bekommst du das Datenbankfeld „deleted_at“:

Mein Tipp Wenn du eine Tabelle mit vielen Feldern hast und insbesondere falls die Soft-Deletes nach Deiner Erwartung eine gewisse Rolle bei der Tabelle spielen werden, dann solltest du das Soft-Delete-Feld eher an den Anfang der Tabelle platzieren. Somit hast du es später leichter in Deiner DB-Verwaltungsoberfläche (phpMyAdmin oder ähnliches) einen Überblick zu erhalten, welche Datensätze „Soft-Deleted“ wurden.

Schritt 2: Soft-Deletes im Model aktivieren

Im Prinzip musst du jetzt nur noch dem entsprechenden Model mitteilen, daß es Soft-Deletes verwenden soll, indem du sagst:
use SoftDeletes;

Selbstverständlich muss „SoftDeletes“ oben in der  Datei importiert werden.
(Das passiert aber wenn man z.B. PhpStorm verwendet ganz automatisch.)

Wie wirken sich Laravel-Soft-Deletes aus?

Merkregel: Soft-Deletes haben mit Eloquent zu tun und NICHT mit dem QueryBuilder!

Beispiel:
Wir gehen jetzt mal davon aus, dass wir schon mehrere User in der User-Tabelle haben und starten Tinker:
php artisan tinker

Wir können jetzt die ersten 3 Datensätze selektieren.
Sowohl mit Eloquent: User::all(’name‘, ‚deleted_at‘)->take(3)

als auch mit dem QueryBuilder: DB::table(‚users‘)->select(’name‘,’deleted_at‘)->take(3)->get()

bekommen wir ein ähnliches Ergebnis:

Wir haben hier also die ersten 3 User „Martin, Hanna“ und „Herr Prof.“.

Wenn ich jetzt den ersten User mit Eloquent lösche:
User::first()->delete():
dann bekommt dieser User in der Datenbank im „deleted_at“-Feld einen Eintrag:

Wenn ich jetzt aber den ersten User mit Eloquent selektieren möchte:

Dann bekommen wir, wie man sieht den ZWEITEN User angezeigt, dass heisst dieser „soft-deletete“ User ist für Eloquent nicht mehr sichtbar!

Ganz anders jedoch mit dem QueryBuilder:

Hier bekommen wir SEHR WOHL den physikalisch ersten User angezeigt!

Weitere Möglichkeiten von Laravel-Soft-Deletes

Datensätze endgültig löschen mit forceDelete()

Wir haben ja schon gesehen, dass Soft-Deletes sich nur auf Eloquent auswirken, umgekehrt werden mittels QueryBuilder Datensätze auf jeden Fall und endgültig gelöscht. Beispiel:

Hier also aufpassen! Was weg ist, ist weg!

Anders jedoch in ELOQUENT:
Hier muss man die Funktion forceDelete() verwenden, um einen Datensatz auch physikalisch zu löschen, Beispiel:


Datensätze wieder herstellen mit restore()

Soft-Deletete Datensätze kannst du mit der Eloquent-Funktion restore() wieder herstellen. Damit wird das Feld deleted_at wieder auf null gesetzt, Beispiel:

Aber na so was? Wieso habe ich hier „withTrashed()“ verwendet?
Der Grund ist, daß ich den Datensatz nur „restoren“ kann, wenn ich ihn vorher selektiert habe. Wenn ich das „withTrashed()“ weggelassen hätte, dann hätte er den Datensatz mit der id=4 welcher vorher Soft-Deleted wurde gar nicht gefunden!

Somit haben wir auch gleich die Frage beantwortet, wie ich soft-deletete Datensätze anzeigen kann:

Gelöschte Datensätze anzeigen

Wenn ich z.B. alle Datensätze komplett anzeigen möchte:

Wie du siehst ist hier die Syntax eine etwas andere….

Wenn ich nur die gelöschten Datensätze anzeigen möchte:

Wenn ich ALLE Datensätze sehen möchte, aber nur bestimmte Felder:

Wenn ich ALLE GELÖSCHTEN Datensätze sehen möchte die eine ‚id‘ kleiner als 10 haben:

Wie du siehst kann das ein bisschen tricky sein, wenn man noch nicht so eloquent mit Eloquent ist 😉 Aber Übung macht den Meister! 🙂
Für dieses Art von Tests ist halt Laravel Tinker einfach super geeignet!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Get the Newsletter !