2009-09-08 49 views
1

我试图复制表单中的特定条目。我通过表单ID获取所有列值,并尝试使用saveAll将其另存为新行。但不是创建一个新行,而是更新现有条目。CakePHP saveAll-在mysql中更新行而不是保存为新行

这里是我的代码:

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; 
    } 

我想也许因为形式的名称是一样的,它得到更新。所以我将“复制”字符串添加到表单的名称中。然而,旧的条目只是更新。

这是我的表“形式”和它们的类型的列:

Field   Type 

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

id字段是自动递增,所以我想如果我给一个保存方法,该ID将产生它自己的。

回答

5

Cake决定是否更新现有记录,或者由于数据库中存在id字段和此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); 

作为一般的建议:不要用一个阵列复制一个内容到另一个阵列,尤其是如果这是你的模型数据。首先它是单调乏味的,但更重要的是,如果你添加一个新列到你的Form表中,你必须搜索所有应该复制新字段的地方,或者更可能的是,会引入有趣的错误,因为当你复制一个Form时,新的字段丢失。

+0

是的,它的工作原理..感谢您的帮助和建议..我会避免复制一个一个数组的内容,并通过这种方法.. – Angeline 2009-09-08 06:02:46

+0

但这种方法的工作,如果我有很多记录相同ID(不是主要的ID)??如果有很多记录,我必须去使用每个循环的权利? – Angeline 2009-09-08 06:56:50

+1

当然,如果您使用的不是主ID,您可能会获得许多记录。在这种情况下请注意调用'$ this-> create()'或使用'saveAll()'。 http://book.cakephp.org/view/75/Saving-Your-Data – deceze 2009-09-08 08:10:52

相关问题