@zuborawka さんにハードルを上げられてしまったので、便利そうなな話をがんばります。
ちなみに最初にアドベントカレンダーに投稿しようと思っていた 闇 なエントリーはこちら
今回のアドベントカレンダーでは modifiedを更新するために論理削除の話をしようと思います。
CakePHP界隈でも論理削除のPluginは多くあります。
-
mariano/syrup の
soft_deletable.php
(CakePHP 1.3.x) -
CakeDC/utils の
SoftDeleteBehavior.php
- kozo/LogicalDeleteBehavior (CakePHP 1.3.x おそらく @kozo がCakePHP2.x対応版を隠し持っている)
Fusicの論理削除の変遷
以下、個人的見解です
古き良きCakePHP1.xの時代
かつてCakePHP1.xを利用していたころ、まだPluginへの切り出しは少なく、Behaviorとして公開されていたsoft_deletable.phpだけが広く認知されていました(初期soft_deletable.php
)。
当初上記 初期soft_deletable.php
はPostgreSQLに対応しておらず(BOOLEANの扱い)、Fusicではこれを拡張してPostgresSQLでも使えるようにして利用していました。
CakePHP2.xの登場
CakePHP2.xの登場によりBehaviorの書き方が変更になり、初期soft_deletable.php
をそのまま使えなくなりました。
当時、しっかりと管理されていた論理削除機能をもつPlugin(で見つけられたもの)はCakeDC/utilsだけでしたが、これは、「論理削除の挙動」が初期soft_deletable.php
と異なり、そのまま何も考えずつかってしまうことで度々「仕様の勘違いによる不具合」を発生させることがありました。
具体的には delete_flg = NULL
の時の挙動が、以下のように異なります
-
初期soft_deletable.php
はfindで取得する - CakeDC/utilsだとfindで取得しない
これはDBのテーブルが default 0
設定をしていなかったり、途中から論理削除機能を導入しようとしたときに問題になります。
ここから 論理削除機能は群雄割拠時代を迎えます。
論理削除群雄割拠
初期soft_deletable.php
の挙動に慣れてしまっている人はPosgreSQLに対応したmariano/syrupを、独自にCakePHP2.xに対応させて利用していました。
また、CakeDC/utilsを検討し、正しく活用する人もいました。
この時には既に「Behaviorのまま配布するのは良くない。全てはPluginに内包すべき」という流れがはじまり、初期soft_deletable.php
派の人たちによる論理削除プラグイン亜種が発生することになりました。
Yasd: Yet Another SoftDeletable Behavior
拙作Yasdの紹介をします。
Yasdはまさに「 初期soft_deletable.php
亜種」の部類に入ります。またFusicの事情(PostgreSQL / MySQLの混在)にもマッチしているものになっています。
特徴としては
-
delete_flg = NULL
の場合もfindで取得できる - hasOne、hasMany、hasAndBelongsToMany 先のModelに対しても1階層論理削除チェックを行う
- テストケースが書かれている
- CIがMySQL / PostgreSQLで実施されている
というものがあります。
さらに、最近の機能追加で
-
初期soft_deletable.php
や CakeDC/utils で要求されていた「フラグdelete_flg
」と「削除日時deleted
」の2つのフィールドを、どちらか1つのフィールドだけでも動くように対応
というものもあります。
使い方
<?php
class AppModel extends Model {
public $actsAs = [
'Yasd.SoftDeletable'
];
...
と書いておけば、該当モデルでdelete_flg
と deleted
が存在していれば、勝手に論理削除機能が発動します。
<?php
class AppModel extends Model {
public $actsAs = [
'Yasd.SoftDeletable' => [
'field' => false,
'field_date' => 'deleted',
]
];
...
と設定すると、該当モデルで deleted
だけ存在していれば、勝手にdeleted
を利用した論理削除機能が発動します。
というわけで
論理削除機能にYasdはいかがでしょうか?