РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
366 of 1392 menu

Класс 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,
    который восстанавливает мягко удалённые записи
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить