Удалить запись, сохраняя в базе данных (Soft Delete)

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

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

# app/models/News.php
use Illuminate\Database\Eloquent\SoftDeletes;

class News extends Model
{
    use SoftDeletes;
}

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

Для метода 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();

Добавить мягкое удаление (Soft Delete) через миграцию

Если к текущей базе данных надо добавить мягкое удаление, то это можно сделать через миграцию с помощью метода softDeletes().

// файл с миграцией
return new class extends Migration
{
    public function up(): void
    {
        Schema::table('news', function (Blueprint $table) {
            $table->softDeletes(); // добавить мягкое удаление
        });
    }

    public function down(): void
    {
        Schema::table('news', function (Blueprint $table) {
            $table->dropSoftDeletes(); // удалить мягкое удаление при откате
        });
    }
};