- 2007-04-05
- php
Model#save()は、idがセットされているかどうかでinsertかupdateかを判断しているようです(さらに、lidがセットされていれば、本当に存在するかをSELECTしてみています)。
ですが、一般的なコントローラのeditアクションは、
A.12. Posts の編集:CakePHP プログラマーズ リファレンスガイド
function edit($id = null)
{
if (empty($this->data))
{
$this->Post->id = $id;
$this->data = $this->Post->read();
}
else
{
if ($this->Post->save($this->data['Post']))
{
$this->flash('投稿を更新しました。','/posts');
}
}
}
こんな感じで、データがpostされた場合はidをセットしていません。
ではなぜこれをupdateと判断するかというと、URLの1つめのパラメータは暗黙でデフォルトのモデルのidにセットされるからです。
じゃなくってこのドキュメントの例では、idをhiddenで渡しているからでした。
で、このhiddenが無い場合の話が以下に続きます。
しかし、コントローラでvar $uses = array('Model1', 'Model2')などと明示的に使うモデルを指定していると、この暗黙のidのセットは動作しないようです。
なので、uses を指定している時や、URLの1つめのパラメータをデフォルトのモデルのidとして使いたくない場合は、明示的にidをセットしましょう。