Laravel Laravel-admin PHP プログラミング

【Laravel】Laravel&Laravel-adminでの論理削除 ~ORMとDBファサード~

投稿日:2019年5月18日 更新日:

Laravelでは論理削除を行う機能が備わっています。

論理削除と物理削除に関しては以下に詳しく紹介されています。

参考:論理削除と物理削除とは

データを削除したいけれど、後々データの復元を行う可能性がある場合などに用います。

会員データなどはすぐに削除を行わず、一定時間が経過後削除を行うシステムはよく見受けられます。

ただ、データが累積し検索機能の低下につながるため、よく検討し必要に応じた実装を心がけるようにしましょう。

環境

Laravel5.5

Laravel-admin1.6

MariaDB 10.1.30

この記事の実証内容と結果

削除方法としては以下を試しました。

①ORMによる削除

②DBファサードのdeleteによる削除

③DBファサードのtruncateによる削除

④クエリビルダによる削除

各削除方法で論理削除が行えているかを検証してみました。

また、削除対象のレコードは以下の2種類のレコードに対し実行しました。

以下、検証結果となります

ア.普通のレコード

「普通のレコード」とは「論理削除されていない」という意味になります。

①ORMによる削除

当たり前ながら「deleted_at」に日付が挿入され、論理削除が機能されていることが確認できました。

②~④

ORM以外の削除では、モデルに論理削除であることを宣言していても、レコードは物理削除されてしまうことが確認できました。

イ.論理削除済みのレコード

①の方法で論理削除を行ってから②~④の方法を実行しました。

当たり前の結果かもしれませんが、論理削除済みのレコードは物理削除されます。

したがって、論理削除を行いたい場合はORMを使用するか、処理速度の関係でORM以外を使用する場合はdeleteやtruncateではなく、deleted_atに値を挿入する、という選択をとる必要があります。

実証方法・内容の詳細

Laravelの論理削除実装方法はLaravel公式ページに記載されています。

方法としては論理削除を実装したいテーブルのモデルに、以下のグレーマーカーの2行の記述を追加します。

・TestUser.php

また、対象テーブルにdeleted_atカラムが存在することが条件です。今回使用するテーブルは以下のようにしています。

「$table->softDeletes()」の記述をマイグレーションファイルに記述することでDelete_atカラムが追加されます。

・マイグレーションファイル

以上で完了です。

実証方法はLaravel-adminのフォーム上にボタンを設けそこから削除を行っていきます。

ア.普通のレコード

今回Laravel-adminのフォーム上に4種類のボタンを設置しました。

「復活の呪文」に関してはrestore関数を使用しています。

restore関数ではwhere文による条件指定も行えるほか、onlyTrashedなどで論理削除済みのみの取得など、様々な操作を行うことができます。

Toolクラス

 

コントローラ

 

画面はこんな感じ↓

以下が実行前のレコードです。

それではまずORMによる実行を行っていきたいと思います。

押下後、フォームから消えました。

データベースの確認結果が以下です。

復活の呪文を押下しますと、レコードが復活していることが確認できます。

 

ORMによる削除に関しては「deleted_at」に日付が挿入され、論理削除がちゃんと機能出来ました。

続けて行っていきたいと思います。次はDBファサードによるdeleteを実行していきたいと思います。

押下後、レコードが削除されます。

ここでレコードが物理削除されてしまいました。

この後、truncateとクエリビルダについても同様に物理削除となってしまうことが確認できました。

イ.論理削除済みのレコード

今度は一度論理削除したレコードに対してDBファサードの削除を実行します。

まずはORMを使用し、論理削除を行います。

その後DBファサードのdeleteを実行します。

こちらに関してもDBファサードのdeleteとtruncate、クエリビルダの削除を実行するとレコードごと削除を行います。

まとめ

ソースコードまで追ってはないのではっきりとしたことは分かっていませんが、ORM以外での処理はLaravel内のモデルを経由しないためか、

論理削除は実行されませんでした。

この影響は、論理削除以外にも処理速度など大きく表れるか、という疑問も残る結果になりました。

また、そのあたりについて実証してみたいと思います。

-Laravel, Laravel-admin, PHP, プログラミング

関連記事

【Laravel-admin】Laravel-adminでのRoles(役割)とpermission(権限)について

前回「【laravel-admin】Laravel-adminで新規テーブルを作成しCRUD画面を追加する方法」でテーブルを作成し画面を追加しました。 今回は作成したテーブルの操作画面をメニューを追加 …

【Laravel-admin】バリデーションルールの追加

どうもこんばんは。 突然ですが、先日2月15日、RISING SUN ROCK FESTIVALにてNUMBER GIRLの復活が報じられました。 NUMBER GIRLがオリジナルメンバーで復活!「 …

【Laravel-admin】リレーション関係を持ったCRUD作成(1対1、1対多、多対多)

前回、【Laravel-admin】Laravel-adminで新規テーブルを作成しCRUD画面を追加する方法でLaravel-adminでテーブルのCRUD画面を作成しました。 単一のテーブルであれ …

エンジニア転職記 –在職中に使用したサービス–

プログラミング転職記とか114514番煎じネタだと思うけど技術ネタは投稿までが時間がかかるので、自分の体験でも書きたいと思います。 今、プログラミングブームだとよく感じます。テレビでもネットでもAIや …

【VirtualBox】スナップショットの作成・適用・削除

業務では主にHyper-Vを使用しているのですが、「チェックポイント」という機能がとても便利で重宝しています。 機能の概要は、稼働している仮想環境を「チェックポイント」として保存することができ、作成し …