1. TOP
  2. コムセント 技術情報
  3. Codeigniter 4 におけるdeleted_atの挙動について

Codeigniter 4 におけるdeleted_atの挙動について

 データベースにおける「削除」の概念ですが、完全にデータを削除する物理削除と特定のフラグを立てるなどして「このデータは削除されている」と扱う論理削除が存在します。
 Codeigniter 4では、deleted_atというカラムに削除した時間を格納することで、「ここがNULLでなければ削除したものとして扱う」という形に自動的にしてくれるシステムが存在します。

システムの有効化

Codeigniter 4ではテーブルごとにModelを作成しますが、そのModel内で以下のコードを記載するとそのmodelを経由した時のみ論理削除がONになります。

なお「modelを経由した時のみ」ですので、例えば$db->queryを使用するなど、SQL文を直接記載した場合はこの設定が読まれる事はないためそのまま物理削除が行われてしまいます。

挙動の変化について

$useSoftDeletesをtrueにすると以下の挙動が変化します。

◆delete()を指定した時の挙動が変化する


◆find(),first(),findAll()などのデータ取得系の挙動が変化する。

論理削除をONにした環境で、データの物理削除を行いたい

何らかの理由でデータの物理削除を行いたい場合は、delete文の第2引数にtrueを付与するだけで削除できます。


削除済みデータを取り扱う

以上の自動的に行われるSQL補完により、削除されたデータが取得されることは自動的になくなります。
逆に言えばdeleted_atに値が入っているデータを取得できなくなってしまうのですが、それを回避するための「withDeleted()」「onlyDeleted()」という命令があります。


updateの落とし穴について

update()命令に関しては、deleted_atを判定するためのSQL文は追加されないため、論理削除されているデータでもデータの更新ができてしまいます。

上記のように削除データに対してID指定をする場面はまず無いでしょうが、特定の値を持つデータ郡に対して一括置換などを行いたい時など、問題が発生するおそれがあります。
そのため、一括置換を行いたい場合は手動でdeleted_atがNULLであることを確認したほうがいいでしょう。

逆に言えば、IDを指定してupdateでNULLを指定すればそれだけでデータの復旧も可能です。

まとめ

 Codeigniter 4には論理削除をサポートするシステムが存在しますが、updateの方ではサポートされていないというちょっとした落とし穴もありますので、ご注意ください。

プログラマー / S.Y

PHPフレームワーク「CodeIgniter」を用いたWebサイト開発を専門とする。要件に応じ、WordPressサイトの構築から、JavaScriptを活用した動的なフロントエンド・バックエンドの実装まで、幅広く担当する。

このメンバーの記事一覧へ