UNIX的なアレ

UNIX的なこととかいろいろ

deleteAllはデフォルトでafterDeleteが実行されないよ

CakePHP1.2 Behaviorでモデルのメソッドキャッシュを行う : エクスギア Blog
こちらで紹介されている、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);

みたいな感じでセットしてあげると無事実行されましたよ。