【Laravel】ソフトデリート(論理削除):レコードを残したまま削除する

2024.01.19 /

【Laravel】ソフトデリート(論理削除):レコードを残したまま削除する

記事ではLaravelにおける、ソフトデリート論理削除)について詳しく解説していきます。

データベースにはソフトデリート(論理削除)とハードデリート(物理削除)という概念があります。ソフトデリートとは実際にレコードは削除せずに削除されたことを対象カラムにマークする方法です。

WEBアプリケーションを運用しているとユーザーから誤って削除したデータを復元してほしいという依頼を受けることが多いです。削除したデータの復元はレコードがソフトデリートされていると簡単にできます。

本記事を通して、Laravelでのソフトデリートを実装する方法について理解を深めてください。

ソフトデリートとは

ソフトデリート(Soft Delete)とはデータベースのレコードを実際に削除するのではなく、削除されたことをマークして削除されたように見せる方法です。これによりレコード自体はデータベースに残りますのでレコードの復元が容易になります。

レコードはデータベース上に残っていますが、削除されたことをマークされたレコードは通常のクエリでは取得されません。

Laravelではソフトデリートをサポートしており簡単にWebアプリケーションに実装することができます。

ソフトデリートを実装するとテーブルにレコードが削除された日時を記録するためのカラムが追加されます。Laravelの場合は「deleted_at」カラムがテーブルに追加されます。

POINT

deleted_atカラムに日付が入っていれば削除された状態、入ってなければ削除されていないことを意味します

ユーザーが誤ってレコードを削除することが考えられる場合はソフトデリートをテーブルに追加しておきましょう。

ハードデリート(Hard Delete)とは

ソフトデリートの対となる概念はハードデリート(Hard Delete)です。ハードデリートはレコードがデータベースから完全に削除されることを意味します。

データベースから実際になくなるためソフトデリートのようにレコードの復元が不可能です。

Laravel:ソフトデリートをテーブルに追加する方法

Laravelのテーブルにソフトデリートを追加する方法について解説していきます。ここではすでに存在するpostsテーブルにソフトデリートを追加します。

ソフトデリートをテーブルに追加する流れは以下の通りです。

  1. マイグレーションファイルの作成
  2. マイグレーションの実行
  3. モデルの設定
Laravel用語の確認

マイグレーションとはテーブル作成や定義変更(カラムの変更・追加・削除など)を管理する機能です

マイグレーションファイルの作成

まずはソフトデリートのカラムを追加するためのマイグレーションファイルを以下コマンドを実行して作成します。

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がソフトデリート機能を適切に処理します。

Laravel用語の確認

ORMとはデータベースとマッピングされたオブジェクトを利用して、データベースを操作する技法のことです。ORMを利用することで、SQLを意識せずにデータベース上のデータを管理することができます。Eloquent ORMとはLaravelに備わっているORMです。Eloquent ORMによってテーブルをクラスとして定義して、レコードをクラスのインスタンスとして扱うことができます。

ソフトデリートの使用方法

ソフトデリートで使用するメソッドを解説していきます。

POINT

ソフトデリートで使用するメソッドは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();