【Laravel】リレーション先のデータを論理削除(Soft Delete)する方法

技術メモ

データを削除する方法として、論理削除(ソフトデリート)と物理削除があります。

違いは以下の通りです。

 

・論理削除 ←今回はこちら
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というライブラリを利用することをオススメします。

 

Askedio/laravel-soft-cascade
Cascade Delete & Restore when using Laravel SoftDeletes - Askedio/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にてリレーション先のデータを論理削除する方法について解説しました。

他にも解説して欲しい内容があれば、是非ともコメント欄やお問い合わせからメッセージをください!

それでは!

 

技術メモ
スポンサーリンク
スポンサーリンク
のすけをフォローする
やばブロ!

コメント