updateAll() で beforeSave() および afterSave() コールバックをトリガーする必要があります。IDフィールドを更新する必要があるため、updateAll()を使用します..(編集可能なIDについては「間違っている」ことはわかっていましたが、使用したこのデータベースはすでにそのように面倒です)。
私がする必要があるのは、save() と同じように、updateAll() をトリガーして beforeSave() と afterSave() を起動することです。
これは CakePHP 1.3 の updateAll() のハックです。
function updateAll($fields, $conditions = true) {
$args = func_get_args();
$output = call_user_func_array(array('parent', 'updateAll'), $args);
if ($output) {
$created = false;
$options = array();
$this->Behaviors->trigger($this, 'afterSave', array(
$created,
$options,
));
$this->afterSave($created);
$this->_clearCache();
return true;
}
return false;
}
次に、これはCakePHP 2.3で調整したコードです
function updateAll($fields, $conditions = true) {
$args = func_get_args();
$output = call_user_func_array(array('parent', 'updateAll'), $args);
if ($output) {
$created = false;
$options = array();
$event = new CakeEvent('Model.afterSave', $this, array($created, $options));
$this->getEventManager()->dispatch($event);
$this->afterSave($created);
$this->_clearCache();
return true;
}
return false;
}
問題は、updateAll で beforeSave() を呼び出したい場合はどうすればよいかということです。