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