はじめに
Laravelでデータを削除するとき、delete()
を呼ぶだけで簡単に削除できますが、
実は「ソフトデリート(論理削除)」と「ハードデリート(物理削除)」の2種類があることをご存知でしょうか?
この2つの違いや使い分けを、自分の学習メモとして整理しておきます。
①ソフトデリート(論理削除)とは?
データベースからレコードを物理的には削除せず、「削除済み」としてマークする方式です。
Laravelでは、SoftDeletes
トレイトをモデルに追加するだけで使えます。
モデルでの設定
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
}
必要なカラム
マイグレーションでdeleted_adカラムを追加します。
$table->softDeletes(); // datetime型の deleted_at カラムを追加
②ソフトデリートの操作方法
1.データの削除(論理削除)
$post = Post::find($id);
$post->delete();
→ 実際には削除されず、deleted_at に日時が記録されるだけ。
2.削除済みデータを取得する
Post::withTrashed()->get(); // 削除済みも含む
Post::onlyTrashed()->get(); // 削除済みのみ
3.削除を取り消す(復元)
$post->restore();
③ハードデリート(物理削除)とは?
データベースからレコードを完全に削除する方式です。
方法1: ソフトデリートを使わずにdelete()
$post = Post::find($id);
$post->delete(); // 完全削除される
方法2: ソフトデリートモデルでforceDelete()
$post = Post::find($id);
$post->forceDelete(); // 完全に削除(復元できない)
④ソフトデリートとハードデリートの比較
⑤実務での使い分けの目安
-
ユーザーや投稿など、将来的に復元の可能性があるデータ
→ ソフトデリートを使用する -
ログや一時データなど、完全に消して問題ないデータ
→ ハードデリートでOK
⑥まとめ
- Laravelでは簡単に「削除の種類」を使い分けられる
- ソフトデリートは SoftDeletes トレイト+ deleted_at のカラムが必要
- ハードデリートは forceDelete() またはソフトデリート未使用モデルの delete()
- 安全第一の設計をしたいなら、まずはソフトデリートで運用してみるのがベター