deleteAllはデフォルトでafterDeleteが実行されないよ
http://www.exgear.jp/blog/2008/11/cakephp12-behavior%E3%81%A7%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E8%A1%8C%E3%81%86/
こちらで紹介されている、behaviorでのモデルキャッシュがなかなか便利なのでよく使っております。ソースを読むとわかりますが、afterSave,afterDeleteでちゃんとキャッシュを削除してくれているのも便利なポイントです。
しかし、deleteAllではcallback関数のafterDeleteが実行されないという現象に遭遇しました。というわけでコードリーディング。
さて、deleteAllのソースコードは以下のような感じです。
- cake/libs/model.php
<?php function deleteAll($conditions, $cascade = true, $callbacks = false) { if (empty($conditions)) { return false; } $db =& ConnectionManager::getDataSource($this->useDbConfig); if (!$cascade && !$callbacks) { return $db->delete($this, $conditions); } else { $ids = Set::extract( $this->find('all', array_merge(array('fields' => "{$this->alias}.{$this->primaryKey}", 'recursive' => 0), compact('conditions'))), "{n}.{$this->alias}.{$this->primaryKey}" ); if (empty($ids)) { return true; } if ($callbacks) { $_id = $this->id; $result = true; foreach ($ids as $id) { $result = ($result && $this->delete($id, $cascade)); } $this->id = $_id; return $result; } else { foreach ($ids as $id) { $this->_deleteLinks($id); if ($cascade) { $this->_deleteDependent($id, $cascade); } } return $db->delete($this, array($this->alias . '.' . $this->primaryKey => $ids)); } } }
とまぁこんなソースになっているわけです。$callbacks = falseが標準でセットされているわけですね。というわけで、
<?php $this->Model->deleteAll($conditions,true,true);
みたいな感じでセットしてあげると無事実行されましたよ。