Поле softDeletes
Метод softDeletes применяется в миграциях для добавления
поля deleted_at, которое хранит дату и время удаления записи.
Это позволяет не удалять записи физически из базы данных,
а помечать их как удалённые. При использовании трейта
SoftDeletes в модели Eloquent, все запросы автоматически
исключают мягко удалённые записи.
Синтаксис
<?php
Schema::table('table_name', function (Blueprint $table) {
$table->softDeletes();
});
?>
Метод не принимает параметров и добавляет колонку
deleted_at типа timestamp, которая может быть NULL.
Пример использования в миграции
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('articles', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->boolean('active')->default(true);
$table->timestamps();
$table->softDeletes();
});
}
public function down(): void
{
Schema::dropIfExists('articles');
}
};
?>
Пример модели с SoftDeletes
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Article extends Model
{
use SoftDeletes;
protected $fillable = ['title', 'content', 'active'];
}
?>
Пример удаления записи
При вызове метода delete у модели с трейтом
SoftDeletes запись не удаляется физически,
а в поле deleted_at сохраняется текущая дата и время:
<?php
use App\Models\Article;
$article = Article::find(1);
$article->delete();
$deleted = Article::whereNotNull('deleted_at')->first();
echo $deleted->title;
?>
Результат выполнения кода:
"article 1"
Пример получения всех записей вместе с удалёнными
Метод withTrashed позволяет включить мягко удалённые
записи в результаты запроса:
<?php
use App\Models\Article;
$articles = Article::withTrashed()->get();
foreach ($articles as $article) {
echo $article->title . ' - ' . ($article->trashed() ? 'deleted' : 'active');
}
?>
Результат выполнения кода:
"article 1 - deleted"
"article 2 - active"
"article 3 - active"
Пример получения только удалённых записей
Метод onlyTrashed возвращает только мягко удалённые записи:
<?php
use App\Models\Article;
$trashed = Article::onlyTrashed()->get();
foreach ($trashed as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
Пример восстановления удалённой записи
Метод restore удаляет метку времени из поля
deleted_at, восстанавливая запись:
<?php
use App\Models\Article;
$article = Article::withTrashed()->where('id', 1)->first();
$article->restore();
$res = Article::all();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 2"
"article 3"
Пример принудительного удаления
Метод forceDelete полностью удаляет запись из базы данных,
независимо от наличия мягкого удаления:
<?php
use App\Models\Article;
$article = Article::find(2);
$article->forceDelete();
$res = Article::all();
foreach ($res as $article) {
echo $article->title;
}
?>
Результат выполнения кода:
"article 1"
"article 3"
Смотрите также
-
трейт
SoftDeletes,
который добавляет методы для работы с мягким удалением -
метод
withTrashed,
который включает удалённые записи в запрос -
метод
onlyTrashed,
который возвращает только удалённые записи -
метод
restore,
который восстанавливает мягко удалённую запись