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.