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
を定義するだけで、論理削除を安全かつ簡単に導入できます。