Класс SoftDeletes
Класс SoftDeletes представляет собой трейт, который добавляет модели возможность мягкого удаления. При использовании этого трейта записи не удаляются из базы данных физически, а лишь помечаются временем удаления в поле deleted_at. Это позволяет восстановить запись в любой момент или скрыть её от обычных запросов. Трейт автоматически добавляет глобальный скоуп, который исключает удалённые записи из результатов всех запросов.
Подключение трейта
Для использования мягкого удаления необходимо подключить трейт SoftDeletes в модели и добавить поле deleted_at в свойство dates или casts:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;
class Article extends Model
{
use SoftDeletes;
protected $fillable = [
'title',
'content',
'status'
];
protected $dates = ['deleted_at'];
}
?>
Миграция с полем deleted_at
Для работы мягкого удаления необходимо добавить поле deleted_at в таблицу. Laravel предоставляет специальный метод softDeletes для создания такого поля:
<?php
use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;
return new class extends Migration
{
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->string('status')->default('draft');
$table->softDeletes();
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('articles');
}
};
?>
Удаление записи
При вызове метода delete на модели с подключённым трейтом SoftDeletes запись не удаляется физически, а лишь устанавливается текущее время в поле deleted_at:
<?php
use AppModelsArticle;
$article = Article::find(1);
$article->delete();
echo $article->deleted_at;
?>
Результат выполнения кода:
"2024-01-15 12:30:45"
Получение записей без учёта удалённых
По умолчанию все запросы автоматически исключают мягко удалённые записи. Метод all вернёт только не удалённые записи:
<?php
use AppModelsArticle;
$articles = Article::all();
foreach ($articles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 3"
"article 5"
Получение удалённых записей
Для получения только мягко удалённых записей используется метод onlyTrashed:
<?php
use AppModelsArticle;
$trashedArticles = Article::onlyTrashed()->get();
foreach ($trashedArticles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 2"
"article 4"
Получение всех записей включая удалённые
Метод withTrashed позволяет получить все записи, включая мягко удалённые:
<?php
use AppModelsArticle;
$allArticles = Article::withTrashed()->get();
foreach ($allArticles as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
"article 4"
"article 5"
Восстановление записи
Метод restore восстанавливает мягко удалённую запись, очищая поле deleted_at:
<?php
use AppModelsArticle;
$article = Article::onlyTrashed()->where('id', 2)->first();
$article->restore();
echo $article->deleted_at;
?>
Результат выполнения кода:
""
Принудительное удаление
Метод forceDelete выполняет физическое удаление записи из базы данных, полностью игнорируя механизм мягкого удаления:
<?php
use AppModelsArticle;
$article = Article::find(1);
$article->forceDelete();
$exists = Article::withTrashed()->where('id', 1)->exists();
echo $exists ? 'exists' : 'not exists';
?>
Результат выполнения кода:
"not exists"
Проверка состояния записи
Метод trashed позволяет проверить, является ли запись мягко удалённой:
<?php
use AppModelsArticle;
$article1 = Article::find(1);
$article2 = Article::onlyTrashed()->where('id', 2)->first();
echo $article1->trashed() ? 'deleted' : 'active';
echo $article2->trashed() ? 'deleted' : 'active';
?>
Результат выполнения кода:
"active"
"deleted"
Массовое восстановление
Метод restore можно применять к построителю запросов для массового восстановления записей:
<?php
use AppModelsArticle;
$count = Article::onlyTrashed()->where('status', 'archived')->restore();
echo $count;
?>
Результат выполнения кода:
"3"
Смотрите также
-
метод
softDeletes,
который добавляет поле для мягкого удаления в миграции -
метод
withTrashed,
который включает удалённые записи в выборку -
метод
onlyTrashed,
который выбирает только удалённые записи -
метод
restore,
который восстанавливает мягко удалённые записи