Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?
@f_uto

cakePHP CakeDCのsoftDelete

More than 3 years have passed since last update.

cakePHPにおいてfindやadd,view,deleteといったものはデフォルトで用意されていますが、deleteについては、delete_flagやdeletedやisDeleteといった削除フラグ的なもので物理削除ではなく論理削除をしたいところです。

単純にdeleteの代わりを用意してdelete SQLではなくupdate SQLを実行するように書けばわかりやすいかと思います。ですがその場合は、find出の検索時もいちいち削除フラグがonではない(削除されていない)という条件を付けなければなりません。まあ、それだけなのですが。。

せっかくcakePHPやっているのでdeleteの動きを変更してやることができるので使ってみましょう。
behaviorの機能を使うことになります。

CakeDCというところから出ているsoftDeleteというbehaviorを利用します。
Utils Plugin for CakePHP http://cakedc.com

説明にありますが、appModelにそれぞれ追加が必要です。
※検索しててもappModelに追加する記述がなくてうまくいきませんでした。追加するとばっちりです。

あとは、
http://www.tailtension.com/cakephp/398/
こちらが参考になります。

  • テーブルに論理削除用のカラムを作成

削除フラグ

名前:deleted
型:tinyint(1)
※デフォルト値:0

削除日

名前:deleted_date
型:datetime

  • モデルに追加
model/hogehoge.php
public $actsAs = array( 'SoftDelete' );

以下説明です。

SoftDelete Behavior

The SoftDelete behavior allows you to keep records on database and do not show them to users having a "deleted" flag. By default you should have "deleted" and "deleted_date" fields on your database table.
Since "exists" method in Model disable callbacks you may experience problems using it. To avoid these problems you can use the "existsAndNotDeleted" method from the behavior and we provide the following code to be put into AppModel to make this transparent:

AppModel.php
 <?php
public function exists($id = null) {
    if ($this->Behaviors->attached('SoftDelete')) {
        return $this->existsAndNotDeleted($id);
    } else {
        return parent::exists($id);
    }
}

It will call SoftDelete::existsAndNotDeleted() for models that use SoftDelete Behavior and Model:exists for models that do not use it
When deleting an item the SoftDelete behavior will override the delete() and update the record instead. This means that the response to the delete() will be false. In order to override this and return true, you will need to include the following in your AppModel.php file.

AppModel.php
<?php
public function delete($id = null, $cascade = true) {
    $result = parent::delete($id, $cascade);
    if ($result === false && $this->Behaviors->enabled('SoftDelete')) {
       return (bool)$this->field('deleted', array('deleted' => 1));
    }
    return $result;
}
16
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
f_uto
株式会社クオリアシステムズのCTO&COOをしております。 新体制になりまして、エンジニア毎月1名程度募集してます。SESのような責任のない契約形態は基本NGです。お仕事は責任持って業務委託、請負で行いますし、行っていただきたい。 ※SES業界に疲れたエンジニアの方はぜひ、声かけてください。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
16
Help us understand the problem. What is going on with this article?