CakePHP : beforeDelete() でちょっと幸せになる

CakePHP のコールバック関数たちは優秀ですね。
もちろん便利に活用させてもらってます。

今日は afterDelete() で後処理を色々する場合の、beforeDelete() を使ったちょっとしたTipsをご紹介します。

afterDelete() では $this->data は空

$this->id は格納されているのですが、$this->data は空なんです。
ま、afterDelete() でデータを利用しない方も多数でしょうから、無駄な処理は入れてないんでしょうね。


ただ関連するデータをアップデートしたりと、削除されるインスタンスが保持するデータを利用したいケースってのも結構あったりします。
これを beforeDelete() で楽して解決してしまおうという主旨です。

beforeDelete() で $this->data をセット

app_model.php に単純に以下のようなコードを書きます。
これで自動的に $this->data はセットされ、 afterDelete() などでデータを使いまわせます。

<?php
/**
 * Before delete callback.
 * The function is cakephp callback method.
 * 
 * @return boolean
 */
    function beforeDelete()
    {
        // 削除する前に保持するデータをオブジェクトに置いておく
        // こうすることで、afterDelete() で保持データを利用できる。
        // 通常では $this->id しか保持されない。
        $this->data = $this->find('first', array(
            'recursive' => 0,
            'conditions' => array($this->name . '.id' => $this->id)
        ));
        return true;
    }
?>

afterDelete() で $this->data を利用するサンプル

私は以下のような形でデータを利用しています。ご参考までに。

<?php
/**
 * After delete callback.
 * The function is cakephp callback method.
 * 
 * @return boolean
 */
    function afterDelete()
    {
    // Update association model
        if (!$this->_updateSummary($this->data['ModelName']['forign_key_id'])) {
            $this->log("Model->afterDelete() Update summary is failed.");
        }
        return true;
    }
?>