Laravel Soft Deletes
Manchmal macht es Sinn, Datenbank-Einträge nicht direkt zu löschen sondern als gelöscht zu markieren. So hat man die Möglichkeit, einen bereits gelöschten Eintrag später wiederherzustellen. Das Grundprinzip entspricht in etwa der bekannten Papierkorb-Funktion in Betriebssystem-Oberflächen wie bei Windows, MacOs etc..
Auch das bietet Laravel out-of-the-box. In nur zwei Schritten lassen sich die sogenannten softDeletes für eine Datenbank-Tabelle aktivieren. Voraussetzung ist nur, dass Eloquent genutzt wird.
Schritt 1: Migration erstellen
In der up-Funktion der entsprechenden migration muss die Zeile $table->softDeletes();
hinzugefügt werden.
Beim Ausführen der Migrations wird dann eine neue Spalte „deleted_at“ angelegt.
public function up() { Schema::create('my_model', function (Blueprint $table) { $table->bigIncrements('id'); $table->softDeletes(); $table->timestamps(); }); }
Schritt 2: Model-Klasse erweitern
In der Model-Klasse unserer Tabelle müssen wir angeben, dass wir den SoftDeletes
Trait nutzen wollen.
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; class MyModel extends Model { use SoftDeletes; }
SoftDeletes im Einsatz
Von jetzt an werden Einträge, die per ->delete()
-Funktion gelöscht werden, nicht mehr aus der Datenbank entfernt, sondern lediglich als gelöscht (deleted_at
) markiert.
Allerdings werden sie bei Abfragen, die über Eloquent laufen auch nicht mehr mit ausgegeben, so dass wir sie als „quasi gelöscht“ ansehen können.
Achtung: Bei Datenbank-Abfragen, die nicht über Eloquent laufen, werden die Einträge natürlich immer noch ausgeliefert.
SoftDeletes Einträge abfragen
Fall soft deleted Objekte bei Eloquent-Abfragen mit abgefragt werden sollen, kann man die entsprechende Abfrage mit ->withThrashed()
ergänzen.
Falls ausschließlich gelöschte Objekte abgefragt werden sollen, geht das analog dazu über ->onlyTrashed()
.
Einträge wiederherstellen
Ein per softDeletes gelöschtes Objekt kann mit ->restore()
wiederhergestellt werden.
Einträge endgültig löschen
Wenn ein Eintrag nun aber endgültig aus der Datenbank gelöscht werden soll, kann die ->forceDelete()
auf dem Objekt verwendet werden.
Über uns

Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project