1

フォームの特定のエントリを複製しようとしています。フォーム ID ですべての列の値を取得し、saveAll を使用して新しい行として保存しようとしています。ただし、新しい行を作成する代わりに、既存のエントリを更新しています。

これが私のコードです:

function duplicateForm($data)
   {
         $this->data['Form']['id']=$data['Form']['id'];
         $existingForm=$this->find('all',array('conditions'=>array('Form.id'=>$this->data['Form']['id'])));

         foreach($existingForm as $ex):
             $this->data['Form']['name']=$ex['Form']['name']." (copy)";
              $this->data['Form']['created_by']=$ex['Form']['created_by'];
               $this->data['Form']['access']=$ex['Form']['access'];
                 $this->data['Form']['status']='Incompleted';
                if($this->saveAll($this->data)) 
                {echo "Success";}
         endforeach;
   } 

フォーム名が同じなので、更新されているのではないかと思いました。そこで、フォームの名前に「copy」文字列を追加しました。それでも、古いエントリは更新されているだけです。

これらは私のテーブル「フォーム」の列とそのタイプです:

    Field            Type   

  id                int(11)             
  name              varchar(25)     
  created_by        int(11)             
  access            varchar(10)     
  created           timestamp           
  modified          timestamp               
  status            varchar(15) 

id フィールドは自動インクリメントなので、save メソッドを指定すると、id が独自に生成されると思いました。

4

1 に答える 1

6

idCake は、フィールドの存在とデータベース内のこれの存在によって、既存のレコードを更新するか、データを新しいレコードとして保存するかを決定idします。を含めるためid、常に既存のレコードが更新されます。

次のようにコードを大幅に簡素化できます。

$form = $this->read(null, $data['Form']['id']);

unset($form['Form']['id']);  // no id == new record
$form['Form']['status'] = 'Incompleted';

$this->create();
$this->save($form);

一般的なアドバイスとして、特にモデル データの場合は、配列の内容を別の配列に 1 つずつコピーしないでください。まず第一に面倒ですが、さらに重要なことは、Formテーブルに新しい列を追加した場合、その新しいフィールドをコピーする必要があるすべての場所を探し出す必要があるか、または、より多くの場合、を複製するたびにその新しいフィールドが欠落するため、面白いバグが発生しますForm

于 2009-09-08T05:34:20.020 に答える