【Laravel】ソフトデリートの使い方|論理削除・復元・完全削除の実装方法

【Laravel】ソフトデリートの使い方|論理削除・復元・完全削除の実装方法 Laravel

Laravelでは、レコードを物理的に削除せず「論理的に削除済み」とマークするソフトデリート(Soft Deletes)の機能が用意されています。これにより、削除したレコードを復元したり、削除済みデータを条件付きで取得したりする柔軟な設計が可能になります。

この記事では、ソフトデリートの基本的な使い方から、復元処理・完全削除・検索への応用まで、実践的な活用方法を解説します。

ソフトデリートとは?

ソフトデリートは、レコードを完全には削除せず、deleted_atカラムに削除日時を記録することで「削除済み」とみなす機能です。

これにより、データの復元や監査ログの管理、論理削除による安全な運用が可能になります。

モデルにSoftDeletesを追加する

まず、モデルにソフトデリート機能を追加するには、Illuminate\Database\Eloquent\SoftDeletesをインポートしてuse宣言します。

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

class Post extends Model
{
    use SoftDeletes;
}

マイグレーションでdeleted_atカラムを追加

deleted_atカラムはソフトデリートに必要なフィールドです。マイグレーションファイルに以下を追加します。

Schema::table('posts', function (Blueprint $table) {
    $table->softDeletes(); // deleted_at カラムが追加される
});

マイグレーションを適用します。

php artisan migrate

レコードの論理削除

通常のdelete()メソッドを使うと、ソフトデリートが有効な場合はdeleted_atが更新されるだけで、レコードはDBから消えません。

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

論理削除されたレコードを含めて取得する

デフォルトでは、ソフトデリートされたレコードはクエリ結果から除外されます。

削除済みレコードも含めて取得したい場合は、withTrashed()を使います。

$posts = Post::withTrashed()->get();

削除済みレコードのみを取得

削除されたレコードだけを取得するには、onlyTrashed()を使用します。

$trashedPosts = Post::onlyTrashed()->get();

削除されたレコードの復元

論理削除されたレコードはrestore()メソッドで復元できます。

$post = Post::onlyTrashed()->find(1);
$post->restore();

完全に削除する(物理削除)

データベースから完全に削除するには、forceDelete()を使います。

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

よくある注意点

  • クエリビルダではソフトデリートが効かないので、Eloquentモデル経由で操作する
  • 論理削除のまま放置しないように、定期的に削除バッチを組む設計も重要
  • 外部キー制約やリレーションを持つ場合は、onDelete('cascade')などと併用に注意

まとめ

ソフトデリートを活用することで、データを完全に消さずに「削除済み」として管理することができます。誤削除への備えや、管理者向けの復元機能など、実務での信頼性向上に役立つ仕組みです。

Laravelでは、モデルにSoftDeletesを追加し、マイグレーションでdeleted_atを定義するだけで、論理削除を安全かつ簡単に導入できます。