SoftDeletesトレイトでLaravelモデルの論理削除を実装する

  • Laravel
  • Eloquent
  • PHP

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

Laravelでレコードを完全に消さずに「削除済み」として扱いたい場合、SoftDeletesトレイトを使うと簡単に実現できる。よく使う書き方を一通りメモしておく。

モデル定義

SoftDeletesトレイトをuseして、deleted_atを$datesに追加するだけ。

use Illuminate\Database\Eloquent\SoftDeletes;
class Item extends Model
{
use SoftDeletes;
protected $dates = ['deleted_at'];
protected $fillable = [
'content'
];
}

マイグレーション側でdeleted_atカラムを用意しておく必要はあるが、モデル側はこれだけで論理削除の対象になる。

削除する(論理削除)

delete()を呼ぶといつも通り消えるが、実際にはdeleted_atに日時が入るだけでレコードは残る。

Item::find(1)->delete();

trashedなデータだけ取得する

論理削除されたデータのみを取得したい場合はonlyTrashed()。

Item::onlyTrashed()->get()

trashedを含めて取得する

通常のクエリは論理削除済みのレコードを自動で除外するが、withTrashed()を挟むと削除済みも含めて取得できる。

Item::withTrashed()->get();

物理削除する

論理削除されたデータを完全に消したい場合はforceDelete()。

Item::onlyTrashed()->forceDelete();

復元する

論理削除を取り消して元に戻すにはrestore()。

Item::onlyTrashed()->restore();

基本の操作はこの5つ(delete / onlyTrashed / withTrashed / forceDelete / restore)を押さえておけば困らなさそう。