2009-09-08 48 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

相關問題