

SoftDeletesトレイトでLaravelモデルの論理削除を実装する
この記事は、構成と文章の整理に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)を押さえておけば困らなさそう。