【環境】
Symfony:1.4.13
doctrine:1.2.4
状況
既存データの更新をしようとして起きた。
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘hoge’ for key ‘PRIMARY’
ちょこっといじったら、エラー内容が下記に変わったけど、エラー内容はほぼ同じ?
SQLSTATE[23000]: Integrity constraint violation: 1557 Upholding foreign key constraints for table ‘op_category’, entry ”, key 1 would lead to a duplicate entry
原因
既存データとセーブデータの ID(プライマリーキー)が被ってるよ、という警告のまんま。
経緯
フォームを利用しているものの、Ajax 通信であったため、フォームをそのまま突っ込むのではなく
手動でデータをセットして保存しようとしていた。
Symfony(Doctrine)では、save メソッドで、INSERT と UPDATE を自動判別してくれるとのことで
INSERT のときと、同じデータのセットの仕方にしていたけど
これがいけなかったみたい。
解決
後述の通り、事前にフォームにデフォルト値を設定することで
エラーは消えた。
INSERT と UPDATE を自動判別
フォーム -> 表示(Model 有り) にあるように
$sample = Doctrine::getTable('Sample')->find($request->getParameter('id'));
$this->form = new MySampleForm($sample);
とすることで、フォームのデフォルト値(既存データ)がセットされ
これによって、INSERT と UPDATE を自動判別しているっぽい。