search
LoginSignup
9

More than 5 years have passed since last update.

posted at

updated at

Organization

論理削除機能の変遷とYasd Plugin for CakePHP

@zuborawka さんにハードルを上げられてしまったので、便利そうなな話をがんばります。

ちなみに最初にアドベントカレンダーに投稿しようと思っていた なエントリーはこちら


今回のアドベントカレンダーでは modifiedを更新するために論理削除の話をしようと思います。

CakePHP界隈でも論理削除のPluginは多くあります。

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で実施されている Build Status

というものがあります。

さらに、最近の機能追加で

  • 初期soft_deletable.phpCakeDC/utils で要求されていた「フラグ delete_flg 」と「削除日時 deleted」の2つのフィールドを、どちらか1つのフィールドだけでも動くように対応

というものもあります。

使い方

<?php

class AppModel extends Model {
    public $actsAs = [
        'Yasd.SoftDeletable'
    ];

...

と書いておけば、該当モデルでdelete_flgdeleted が存在していれば、勝手に論理削除機能が発動します。

<?php

class AppModel extends Model {
    public $actsAs = [
        'Yasd.SoftDeletable' => [
            'field' => false,
            'field_date' => 'deleted',
        ]
    ];

...

と設定すると、該当モデルで deleted だけ存在していれば、勝手にdeletedを利用した論理削除機能が発動します。

というわけで

論理削除機能にYasdはいかがでしょうか?

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9