CakePHPのsaveメソッドがupdateにならない場合


1.更新するテーブルのプライマリキーがセットされているか確認する。

$this->MODEL_NAME->id = $primary_id;

2.実行されたSQLログを取得する。

try {
    $result = $this->MODEL_NAME->save($data);
} catch (PDOException $e) {
    $this->log('DBerror:' . $e->getMessage(), LOG_DEBUG);
}

$this->log($this->MODEL_NAME->getDataSource()->getLog(), LOG_DEBUG);

$this->logで /app/tmp/logs/debug.log にログが書き出される。
書き出されない場合は、core.phpのdebug設定が2になっているか確認。

app/config/core.php
/**
 * CakePHP Debug Level:
 *
 * Production Mode:
 *  0: No error messages, errors, or warnings shown. Flash messages redirect.
 *
 * Development Mode:
 *  1: Errors and warnings shown, model caches refreshed, flash messages halted.
 *  2: As in 1, but also with full debug messages and SQL output.
 *
 * In production mode, flash messages redirect after a time interval.
 * In development mode, you need to click the flash message to continue.
 */
    Configure::write('debug', 2);

3.モデル内で、function exists(){}がオーバーライドされていないか確認する。
通常は、継承元のAppModelの中にあるexists(){}でプライマリキーを条件にしたSELECT文が作成される。
しかし、下記のようなプライマリキー以外の条件を追加したコードが継承したモデル内にあると、SELECT文の条件が変わってしまい別レコードとして処理されてしまう。

public function exists($id = null)
{
    if ($id === false) {
        return false;
    }

    return (bool)$this->find('count', array(
        'conditions' => array(
            $this->alias . '.' . $this->primaryKey => $id,
            $this->alias . '.public_flag' => 1
        ),
        'recursive' => -1,
        'callbacks' => false
    ));
}