Удалить запись, помечая пункт «Удалено»

При удалении записи, её можно сохранять в базе данных, но отмечать что она была удалена. Для этого в базе данных надо создать поле deleted_at (в формате Timestamp, по умолчанию «null»).

И в настройках модели указать параметр SoftDeletes.

# News.php
use Illuminate\Database\Eloquent\SoftDeletes;

class News extends Model
{
    use SoftDeletes;

    // указывать до версии Laravel 5.8
    protected $dates = ['deleted_at'];
}

Теперь при удалении записи, она останется в базе данных и будет заполнено поле с датой удаления (если поле заполнено, значит запись была удалена).

Для метода DB::table()->delete() данный тип удаления не работает (т.е. будет удаляться запись, вместо того, чтобы отмечать, что она была удалена).

Выборка записей вместе с удалёнными

Выбрать записи вместе с удалёнными можно через метод withTrashed().

// выборка записей вместе с удалёнными
News::where(['category_id' => 4])->withTrashed()->get();

Также можно выбрать только удалённые записи через метод onlyTrashed().

// выборка только удалённый записей
News::where(['category_id' => 4])->onlyTrashed()->get();

Восстановить удалённую запись

Восстановить удалённую запись можно через метод restore().

// Восстановить удалённую запись
News::where(['id' => 3])->restore();

Окончательно удалить запись

Удалить запись (активную или помеченную как удалённую) из базы данных можно через метод forceDelete().

// Удалить запись из базы данных
News::where(['id' => 3])->forceDelete();