ソフトデリート

参考

Laravel 5.3 Eloquent:利用の開始

概要

laravelのEloquentではモデルのソフトデリートを行うことができる。

ソフトデリートとはいわゆる論理削除のことで物理削除のように実際にデータを削除するわけではないが該当のデータを削除したものをして取り扱うことをいう。

準備

具体的にはそのモデルのレコードのdeleted_at属性にdate型の値をセットすることでこれを行う。前提としてモデルのテーブルのカラムにdeleted_atがあり、またモデルクラスでIlluminate\Database\Eloquent\SoftDeletesトレイトをuseしておく必要がある。

migrationでdeleted_atを追加するためのメソッドも用意されている。

Schema::table('users', function ($table) {
    $table->softDeletes();
});

使い方

ソフトデリートのために準備されたモデルにdeleteメソッド使うとdeleted_atにその時点の時刻が入り論理削除済みとなる。deleted_atがnullでないレコードはクエリの対象とならない。インタンスに対してtrashed()メソッドを実行するとソフトデリート済みかどうかの結果がブーリアンで返ってくる。

ソフトデリートは常にクエリの対象とならないがあえて含めたい場合にはstatic functionのwithTrashedを使ってクエリを作ればそれができる。これはリレーションのチェーンメソッドとしても使うことができる。

さらにonlyTrashedメソッドを使えば論理削除済みのアイテムのみを選ぶこともできる。

論理削除からインスタンスを復活させるにはそのインスタンスに対してrestore()メソッドをかける。これもリレーションに対して使用できる。

反対に完全削除をかける時にはforceDelete()をインスタンスにかける。