Laravel5.6, 5.7 論理削除を実装する!

Laravel5.6, 5.7 論理削除を実装する!

CRUDのUとDは要らない、とか論理削除は使わない方が良いですとか、色々とご意見はあることですが、僕はよく使うのでLaravel5.6, 5.7 での論理削除機能をご紹介します。

 

今回はなんのテーブルでやろう、、、membersテーブルにしてみようと思います。

ではモデル、コントローラー、リソース、マイグレーションファイルを作成、編集していきましょう。

モデル、コントローラ、マイグレーションファイルの作成

Memberモデルを作成、コントローラー、マイグレーションファイルを一括で出力します。

マイグレーションファイルの編集

マイグレーションファイルを適当に記述。今回は

name: varchar(100)

position: varchar(255)

height: integer, 正の整数 とし、created_at, updated_at, deleted_atカラムを追加。いずれもNULL可能なtimestampです。マイグレートしちゃいます。

ルーティング

web.phpに追記します。

prefixを設定することでurlのmembers/を省略できます。

/members/createでメンバー情報(名前、ポジション、身長)を入力し、postでの/membersで保存、/members/deleteで削除します。

コントローラー編集

MembersController.php

モデルでSoftDeleteトレイトをuseしておくと、Eloquentモデルが自動で論理削除されたレコードを省いてくれますので、Member::all()のような簡潔な書き方ができます。

onlyTrashedメソッドを使用すると、論理削除されたレコード、withTrashedメソッドを使用すると、論理削除に関係なくデータを集計します。

モデル編集

Member.php

モデルでは、fillableなカラムの設定、SoftDeletesトレイトを使用するのみです。

ちなみにリソースはこんな感じです。

members/index.blade.php

deleted_atがnullのデータが未削除部分に、論理削除済のデータが削除済に入ります。アクセスするとこんな感じ。

削除してみます。

論理削除出来ました。

論理削除済データの方には「復旧」、「完全削除」を用意しました。

「復旧」ではdeleted_atをnullに、「完全削除」では物理削除するようにします。

 

restore, forceDelete

web.php

MembersController.php

復旧。

完全削除。

復旧、物理削除も出来ました。where節などと組み合わせることで、削除したユーザーをemailアドレスで復旧なども可能です。開発の一助になれば幸いです。

※ちなみにVoyagerからもdeleted_atカラムを追加出来ますが、自動生成してくれるモデルはSoftDeletesトレイトをuseしていませんでした、惜しい。

Laravelカテゴリの最新記事