Dalsza zabawa z modelami, które mają softDeletes. Uczymy się usuwać, przywracać, trwale usuwać oraz sprawdzać czy są usunięte, poznajemy globalne query scopes dla modeli używających softDeletes.
Ok, najpierw sprawdzanie, czy usunięty:
Artisan::command('note-is-trashed {id}', function (int $id) {
$note = Note::withTrashed()->findOrFail($id);
$this->comment($note->trashed() ? "true" : "false");
});
Wyjaśnienie:
- Używamy zasięgu withTrashed, aby zebrać i usunięte i nieusunięte, bowiem to właśnie sprawdzać będziemy
- metoda trashed sprawdza czy są usunięte (deleted_at inny niż null) czy nie
- Z uwagi na słabe wyświetlanie typów bool w PHP (nie licząc var_dump) zrobiliśmy sobie ternary operator z własną informacją
Ok, teraz usuńmy coś:
Artisan::command('note-delete {id}', function (int $id) {
$note = Note::withoutTrashed()->findOrFail($id);
$note->delete();
$this->comment($note->trashed() ? "true" : "false");
});
Wyjaśnienie:
- Usuwamy, czyli coś jeszcze usunięte nie jest, zatem zasięg withoutTrashed
- Metoda delete tym razem nie usuwa z bazy danych tylko ustawia deleted_at na obecny timestamp
Ok, teraz restore:
Artisan::command('note-restore {id}', function (int $id) {
$note = Note::onlyTrashed()->findOrFail($id);
$note->restore();
$this->comment($note->trashed() ? "true" : "false");
});
Wyjaśnienie:
- Przywracamy, czyli coś musi być usunięte, zatem zasięg onlyTrashed
- Metoda restore przywraca, czyli ustawia deleted_at na null
- Wystarczy, że deleted at zostało ustawione na null i model jest już przywrócony
A teraz trwałe usuwanie:
Artisan::command('note-force-delete {id}', function (int $id) {
$note = Note::withTrashed()->findOrFail($id);
$note->forceDelete();
$this->comment("Deleted");
});
Wyjaśnienie:
- Zasięg withTrashed bo usuwać trwale możemy i te usunięte i jeszcze nie usunięte
- Metoda forceDelete działa jak delete w modelach bez softDeletes, czyli trwale usuwa z bazy danych
To by było na tyle.