スポンサードリンク

CakePHPを触り始めて早1週間
なんとなく、使いやすさは分かってきたけど
まだ、サクサク書けないですね。
ピュアPHPで書いてた時は
その都度、書き換えていたので
ルールを身に付けるまでは辛抱です。
さて、今回は論理削除を試してみました。
やはり、完全にデータを消すと
後々面倒なことがありそうですからね。
スポンサードリンク
SoftDeleteBehaviorを使って論理削除してみる
CakePHPのビヘイビアにSoftDeleteBehaviorというのがありまして
こちらを使用して論理削除の設定をしてみました。
1.SoftDeleteBehaviorをダウンロードして設置

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 簡単に”実データを削除しない”論理削除を実装する
cakePHP2.1でSoftDeleteBehaviorを使う
スポンサードリンク