ここに私のbeforeSave関数があります。 checkExisting()は、$ this-> data内のいくつかのフィールドが一意であるかどうかをチェックし、存在するレコードがない場合はfalseを返します。存在する場合は既存のレコードのIDを返します。この関数は正常に動作しています。私は私のコードが何をすべきだと思う何CakePHP - モデル - > beforeSave()のinsertからupdateへの変更
public function beforeSave(){
if ($this->checkExisting() !== false){
$this->id = $this->checkExisting();
}
return true;
}
はこれです:既存のレコードがある場合は、その既存のレコードのIDをモデル - > IDを設定し、その代わりに、インサートの更新するために、CakePHPのを強制します。
このコードが実際に行うことは、関係なく、新しいレコードを挿入することです。
$ this-> id = $ this-> checkExisting();を変更した場合、 $ this-> checkExisting(); $ this-> data ['Model'] ['id'] = $ this-> checkExisting(); MySQLは、Cakeがまだ更新するのではなく、挿入しようとしているのでエラー(主キーの重複値) 、データ。
Cakeはどの段階で更新ではなく挿入を行うことにしましたか? beforeSave()はこの決定に影響を与えるには遅すぎますか?
編集 - ここに私のコントローラコードがあります:
public function add(){
if (!empty($this->data)){
$saved = 0;
foreach($this->data['Attendance'] as $att){
$this->Attendance->create();
if ($this->Attendance->save(array('Attendance'=>$att))){
$saved++;
}
if ($saved > 0){
$this->Session->setFlash('Data saved successfully','success');
}else{
$this->Session->setFlash('No data was saved. Please make sure you have entered some data.','failure');
}
}
}
}
それについて考え、私が明示的に出席を呼ぶという事実とは何かである::()を作成しますか?
おかげで、私は私のcheckExisting()関数をトリプルチェックしたのだが、それが虚偽またはレコードのIDを返す、必要として働いています。より多くのコード – Will
のための私の編集は、上記の私の編集を参照してください見るCakePHPでは – Tyler
は、UPDATEまたはINSERTであるかどうかを把握するために存在している()コールバックが早い順に、たまたま2.0.5。モデルにexists()を上書きします。 –