【Laravel】ソフトデリート(論理削除):レコードを残したまま削除する
2024.01.19 /
本記事ではLaravelにおける、ソフトデリート(論理削除)について詳しく解説していきます。
データベースにはソフトデリート(論理削除)とハードデリート(物理削除)という概念があります。ソフトデリートとは実際にレコードは削除せずに削除されたことを対象カラムにマークする方法です。
WEBアプリケーションを運用しているとユーザーから誤って削除したデータを復元してほしいという依頼を受けることが多いです。削除したデータの復元はレコードがソフトデリートされていると簡単にできます。
本記事を通して、Laravelでのソフトデリートを実装する方法について理解を深めてください。
ソフトデリートとは
ソフトデリート(Soft Delete)とはデータベースのレコードを実際に削除するのではなく、削除されたことをマークして削除されたように見せる方法です。これによりレコード自体はデータベースに残りますのでレコードの復元が容易になります。
レコードはデータベース上に残っていますが、削除されたことをマークされたレコードは通常のクエリでは取得されません。
Laravelではソフトデリートをサポートしており簡単にWebアプリケーションに実装することができます。
ソフトデリートを実装するとテーブルにレコードが削除された日時を記録するためのカラムが追加されます。Laravelの場合は「deleted_at」カラムがテーブルに追加されます。
deleted_atカラムに日付が入っていれば削除された状態、入ってなければ削除されていないことを意味します
ユーザーが誤ってレコードを削除することが考えられる場合はソフトデリートをテーブルに追加しておきましょう。
ハードデリート(Hard Delete)とは
ソフトデリートの対となる概念はハードデリート(Hard Delete)です。ハードデリートはレコードがデータベースから完全に削除されることを意味します。
データベースから実際になくなるためソフトデリートのようにレコードの復元が不可能です。
Laravel:ソフトデリートをテーブルに追加する方法
Laravelのテーブルにソフトデリートを追加する方法について解説していきます。ここではすでに存在するpostsテーブルにソフトデリートを追加します。
ソフトデリートをテーブルに追加する流れは以下の通りです。
- マイグレーションファイルの作成
- マイグレーションの実行
- モデルの設定
マイグレーションとはテーブル作成や定義変更(カラムの変更・追加・削除など)を管理する機能です
【Laravel】マイグレーションとは(migration):テーブル作成について
マイグレーションファイルの作成
まずはソフトデリートのカラムを追加するためのマイグレーションファイルを以下コマンドを実行して作成します。
php artisan make:migration add_column_deleted_at_to_posts_table --table=posts
作成されたマイグレーションファイルには以下のようにコードを記述します。
public function up(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->softDeletes();
});
}
public function down(): void
{
Schema::table('posts', function (Blueprint $table) {
$table->dropSoftDeletes();
});
}
上記からわかるようにソフトデリートのカラムは「$table->dropSoftDeletes();」で追加されます。
マイグレーションの実行
マイグレーションファイルを定義したら、次にマイグレーションを以下コマンドで実行します。
php artisan migrate
上記コマンドでマイグレーションが実行され、テーブルにソフトデリートのカラム「deleted_at」が追加されます。
モデルの設定
ソフトデリートのカラムを追加したら対象モデルを編集します。以下のようにSoftDeletesトレイトをモデルに追加します。
use Illuminate\Database\Eloquent\SoftDeletes; // 追記
class Post extends Model
{
use SoftDeletes; // 追記
}
SoftDeletesトレイトを追加することでEloquent ORMがソフトデリート機能を適切に処理します。
ORMとはデータベースとマッピングされたオブジェクトを利用して、データベースを操作する技法のことです。ORMを利用することで、SQLを意識せずにデータベース上のデータを管理することができます。Eloquent ORMとはLaravelに備わっているORMです。Eloquent ORMによってテーブルをクラスとして定義して、レコードをクラスのインスタンスとして扱うことができます。
ソフトデリートの使用方法
ソフトデリートで使用するメソッドを解説していきます。
ソフトデリートで使用するメソッドはEloquent ORMを通じて提供されます
ソフトデリートの実行(deleteメソッド)
対象のレコードをソフトデリートする場合は、通常通りモデルインスタンスに対してdeleteメソッドを使用します。
Post::find(54)->delete();
ソフトデリートが実行されると該当レコードのdeleted_atカラムに実行されたときの時間が登録されます。
ソフトデリート済みのレコードを含める(withTrashedメソッド)
実行するクエリ結果にソフトデリートしたレコードも含める場合はwithTrashedメソッドを使用します。
$posts=Post::withTrashed()->get();
通常はソフトデリートされたレコードはクエリ結果から除外されますが、withTrashedメソッドを使うことで含めるようになります。
ソフトデリートされたレコードのみを取得(onlyTrashedメソッド)
実行するクエリ結果でソフトデリートしたレコードのみを取得するにはonlyTrashedメソッドを使用します。
$posts=Post::onlyTrashed()->get();
ソフトデリートされたレコードの復元(restoreメソッド)
ソフトデリートされたレコードを復元する場合はrestoreメソッドを使用します。
$post->restore();
restoreメソッドを実行するとdeleted_atカラムをnullに設定し、レコードを通常のクエリの結果に再び含めます。
ソフトデリートの確認(trashedメソッド)
対象のレコードがソフトデリートされているかどうかを判定するにはtrashedメソッドを使用します。trashedメソッドの返り値はブーリアン値(trueまたはfalse)であり、レコードがソフトデリートされている場合はtrueを、されていない場合はfalseを返します。
$post = Post::find($id);
if ($post->trashed()) {
// モデルがソフトデリートされている場合の処理
} else {
// モデルがソフトデリートされていない場合の処理
}
ハードデリートを実行(forceDeleteメソッド)
ソフトデリートではなくハードデリート(データベースから完全に削除)する場合はforceDeleteメソッドを使用します。
$post = Post::find($id);
$post->forceDelete();