Как использовать Soft Delete в Laravel Eloquent (c примером)

Источник: «How to Soft Delete Using Laravel Eloquent? (With Example)»
Мягкое удаление записей в Laravel позволяет помечать записи как "удалённые", а не удалять их из базы данных навсегда. Это может быть невероятно полезно при работе с информацией, которую в будущем может потребоваться восстановить. К счастью, Laravel поставляется со встроенной функцией soft delete!

Чтобы использовать soft delete в Laravel Eloquent, добавьте в модель трейт SoftDeletes, создайте миграцию с колонкой deleted_at и используйте метод ->delete() для пометки записей как удалённых с одновременным сохранением их в базе данных.

В данном пошаговом руководстве мы рассмотрим, как это можно легко добавить в приложение Laravel.

Шаг 1: Создание модели

Сначала создадим модель для Post с функцией мягкого удаления/soft delete. Сгенерируйте новую модель с помощью Artisan:

php artisan make:model Post

В модель Post (расположенную по адресу app/Models/Post.php) добавьте трейт use SoftDeletes и задайте свойство $deleted_at:

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Post extends Model
{
use SoftDeletes;

protected $casts = [
'deleted_at' => 'datetime',
];

// Код вашей модели здесь...
}

Шаг 2: Создание миграции

Создайте миграцию для таблицы "posts", чтобы добавить столбец deleted_at:

php artisan make:migration add_deleted_at_to_posts_table --table=posts

Модифицируйте сгенерированный файл миграции, добавив $table->softDeletes() в функцию up(). Кроме того, добавьте $table->dropSoftDeletes() в метод down(), чтобы гарантировать возможность отмены отката:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
/**
* Run the migrations.
*/

public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->softDeletes();
});
}

/**
* Reverse the migrations.
*/

public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
};

Затем запустите миграцию:

php artisan migrate

Шаг 3: Мягкое удаление записей

Для мягкого удаления записи в Laravel Eloquent мы просто вызываем функцию ->delete(), как при обычном удалении. Однако поскольку ранее мы добавили в код модели трейт SoftDeletes, Laravel автоматически выполнит мягкое удаление, обновив колонку deleted_at текущей временной меткой.

Это позволяет выполнять мягкое удаление в контроллере или в любом другом месте, используя следующий код:

public function softDeletePost($id)
{
$post = Post::find($id);

if (!$post) {
return response()->json(['message' => 'Post not found'], 404);
}

$post->delete();

return response()->json(['message' => 'Post soft deleted']);
}

Шаг 4: Показ записей

При извлечении сообщений с помощью модели с добавленным трейтом SoftDeletes, Laravel будет автоматически возвращать только те, которые не были удалены. Это означает, что следующий код вернёт все не удалённые сообщения:

public function showPosts()
{
$posts = Post::get();

return response()->json(['posts' => $posts]);
}

Шаг 5: Показать мягко удалённые записи (опционально)

Возможны случаи, когда необходимо отображать мягко удалённые записи, например, функция отображения "Корзины", которая предоставляет пользователям доступ к ранее удалённому содержимому.

Для получения мягких удалённых записей можно использовать метод withTrashed:

public function showSoftDeletedPosts()
{
$softDeletedPosts = Post::onlyTrashed()->get();

return response()->json(['soft_deleted_posts' => $softDeletedPosts]);
}

Шаг 6: Восстановление мягко удалённых записей

Для восстановления мягко удалённых записей можно воспользоваться методом restore на модели:

public function restorePost($id)
{
$post = Post::withTrashed()->find($id);

if (!$post) {
return response()->json(['message' => 'Post not found'], 404);
}

$post->restore();

return response()->json(['message' => 'Post restored']);
}

Шаг 7: Постоянное удаление записей

Иногда требуется окончательно удалить мягко удалённую запись. Например, пользователь может попросить удалить его данные или вы просто хотите освободить место. В таких случаях вместо функции delete() можно вызвать метод forceDelete():

public function forceDeletePost($id)
{
$post = Post::withTrashed()->find($id);

if (!$post) {
return response()->json(['message' => 'Post not found'], 404);
}

$post->forceDelete();

return response()->json(['message' => 'Post permanently deleted']);
}

Заключение

Реализация мягкого удаления в Laravel — это мощный способ обработки удаления записей с сохранением возможности их последующего восстановления.

Выполнив описанные шаги, вы сможете легко интегрировать функцию soft delete в своё приложение Laravel и, при необходимости, отображать удалённые записи. Счастливого кодинга!

Дополнительные материалы

Предыдущая Статья

PHP генераторы — практический пример

Следующая Статья

Выведение типов и аннотации типов в TypeScript