Как использовать Soft Delete в Laravel Eloquent (c примером)
Чтобы использовать 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 и, при необходимости, отображать удалённые записи. Счастливого кодинга!