スポンサードリンク

cake-logo
cake-logo

CakePHPを触り始めて早1週間

なんとなく、使いやすさは分かってきたけど

まだ、サクサク書けないですね。

ピュアPHPで書いてた時は

その都度、書き換えていたので

ルールを身に付けるまでは辛抱です。

さて、今回は論理削除を試してみました。

やはり、完全にデータを消すと

後々面倒なことがありそうですからね。

スポンサードリンク

SoftDeleteBehaviorを使って論理削除してみる

CakePHPのビヘイビアにSoftDeleteBehaviorというのがありまして

こちらを使用して論理削除の設定をしてみました。

1.SoftDeleteBehaviorをダウンロードして設置

SoftDeleteBehavior.php
SoftDeleteBehavior.php

CakeDCのutilsからファイルをダウンロード
utils / Model / Behavior / SoftDeleteBehavior.php

ダウンロードしたファイルをapp/Model/Behaviorのフォルダ内に置く。

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

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

削除日
名前:deleted_date
型:datetime

※型:tinyint(1)の長さや、型を間違えた場合

「deleted = 0」が「deleted = ”」という風になって

うまく機能しませんのでご注意を!

これに気づくのに時間かかったわ・・・

ModelにSoftDeleteBehaviorを使うことを記述する。

public $actsAs = array( 'SoftDelete' );

deleteメソッドの条件を変える

CakePHPのブログチュートリアルにあるdeleteメソッドのままだと

エラーでmissing viewと出てしまいます。

これは

「SoftDeletable Behavior を使用すると Model::del は必ず false が返ります」

ということなんで、

if ($this->Post->delete($id)) {

if (!$this->Post->delete($id)) {

とします。

これでdeleteさせると、物理削除されずに論理削除でテーブルのdeletedカラムに「1」

delete_dateカラムに日付が入り、論理削除できました。

SELECT文では検索した場合はdeleted=0が勝手に条件で入るので、

論理削除されたレコードはヒットしなくなります。

しかし、

アソシエーションしているモデルで

'dependent' => true

の設定をしていても

論理削除の場合はアソシエーション先のモデルは

論理削除になりません。

別に物理削除のままというわけではありません。

何も起こらないだけです。

論理削除の

public $actsAs = array( 'SoftDelete' );

を消して削除してみると

アソシエーション先のモデルも削除されました。

ビヘイビアの中身の問題でしょうね。

そのうち調べてみようとか思います。

今回参考にさせて頂いたサイトです。


CakePHP 簡単に”実データを削除しない”論理削除を実装する

CakePHPのModelの動きを論理削除にしてみる

cakePHP2.1でSoftDeleteBehaviorを使う

スポンサードリンク