ユアスク by みんなシステムズ

MENU

意外と知らない!論理削除と物理削除について

2023/06/29

こんにちは、後藤です。

PCを操作していて、削除ボタンを押す場面は多くあるのですが、削除ボタンを押すのは勇気がいりますよね。

削除=完全に消し去ること(怖い)

こんなイメージが強かったのですが、どうやら削除にも種類があるみたいです。

どちらを使用するかは要件によりますが、削除データの復元が必要な場合や、何らかの理由でデータを保持したい場合には論理削除を使用します。物理削除は完全にデータをデータベースから削除するので、これらの要件がない場合に適しています。ここでは、それぞれの使用方法について説明します。

論理削除(Soft Delete)

LaravelのEloquent ORMでは、論理削除をサポートするSoftDeletingTraitが用意されています。これを使用すると、データは物理的にはデータベースに残りますが、削除フラグを設定することで削除されたとみなされます。

まずは、マイグレーションで論理削除用のカラムdeleted_atを追加します。

Schema::table('users', function (Blueprint $table) {
    $table->softDeletes();
});

次に、モデルでIlluminate\Database\Eloquent\SoftDeletes traitを使用します。

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;

    protected $dates = ['deleted_at'];
}

これで、delete()メソッドを呼び出してもデータは物理的には削除されず、deleted_atカラムにタイムスタンプが設定されます。論理削除されたレコードはデフォルトのクエリから除外されます。

$user = User::find(1);
$user->delete();  // 論理削除

論理削除されたレコードを取得するにはwithTrashed()メソッドを使用します。

$users = User::withTrashed()->get();

物理削除(Hard Delete)

物理削除はデータベースから完全にデータを削除します。Laravelでは、論理削除と同様にdelete()メソッドを使用します。

$user = User::find(1);
$user->delete();  // 物理削除

ただし、一度物理削除を行うとデータは復元できないので注意が必要です。

また、論理削除されたレコードを物理削除するにはforceDelete()メソッドを使用します。

$user = User::withTrashed()->find(1);
$user->forceDelete();  // 物理削除

以上がLaravelでの論理削除と物理削除の基本的な使い方です。

まとめ

Laravelには、アプリケーションの要件に応じて選択できる2つの削除方法、論理削除と物理削除があります。

論理削除は、削除されたレコードをデータベースに保持し、必要に応じて復元可能な選択肢です。LaravelではSoftDeletes traitを利用して簡単に実装でき、deleted_atカラムに削除した日時を保存します。

一方、物理削除はデータベースからデータを完全に削除します。これはデータの復元が不可能なため、取り扱いには注意が必要です。

ぜひ皆さんも、ウェブアプリケーション作成で活用してみてください!