データを削除する方法として、論理削除(ソフトデリート)と物理削除があります。
違いは以下の通りです。
DBからレコードを削除せず、論理削除フラグを実装することで削除したとみなす。(あとから復活可能)・物理削除
実際にDBからレコードを削除する。
今回はタイトルの通り、Laravelでリレーション先のデータを論理削除(Soft Delete)する方法を記載します。
通常の論理削除は簡単
Usersテーブルの論理削除を実装してみます。
マイグレーションファイルに $table->softDeletes(); を追記します。
User.phpに use SoftDeletes; と記載するだけです。
適当にデータを入れて論理削除をしてみます。
web.phpに以下のように記載して、http://127.0.0.1:8000/user/delete にアクセスします。
論理削除を実行する前
論理削除を実行した後
deleted_at カラムに注目すると、論理削除を行った日付が入っています。
リレーション先のデータも論理削除するとき→少し面倒
Userと紐づくPostsテーブルも作成してみます。
Userは多くのPost(投稿)を行うため、User.phpでリレーションを定義します。
Post.phpも作成します。
一件適当にデータをいれて、現在のPostsテーブルを以下の状態にします。
この状態でhttp://127.0.0.1:8000/user/delete にアクセスします。
Userの論理削除はできていますが、Userに紐づくPostテーブルのレコードは論理削除されてません。
※ちなみに物理削除の場合はPostも一緒に削除してくれます。
上記の問題点への対処法を二つ紹介します。
① Modelにbootメソッドを定義する
User.phpにbootメソッドを追記します。
bootメソッドはEloquentの初回呼び出し時に初期設定を行うものです。
ここではそのbootメソッドをオーバーライドしています。
これによりデータ削除時に、リレーション先のPostも論理削除してくれます。
この状態でhttp://127.0.0.1:8000/user/delete にアクセスしてみると、
User、Post共に論理削除ができています。
② laravel-soft-cascadeライブラリを利用する←オススメ
Modelにbootメソッドを定義することでリレーション先のデータを論理削除することは可能ですが、数が増えてくると一つ一つ記載するのが面倒になると思います。
そこで、laravel-soft-cascadeというライブラリを利用することをオススメします。
このライブラリを入れれば、数行で①の処理を行えます。
composerでインストール
※インストール時にエラーが発生する場合は、composer require askedio/laravel-soft-cascade:^5.8 など自分が使用しているLaravelのバージョンに合わせてください。
User.phpを以下のように書き換えます。
この状態でhttp://127.0.0.1:8000/user/delete にアクセスしてみると、
User、Post共に論理削除ができています。
今回はLaravelにてリレーション先のデータを論理削除する方法について解説しました。
他にも解説して欲しい内容があれば、是非ともコメント欄やお問い合わせからメッセージをください!
それでは!
コメント