2012-04-12 80 views
1

如何让Cake使用REPLACE INTO而不是INSERT INTO?我有一个将数据保存到数据库的操作,但我不想重复输入。主键(id)是唯一的,如果该值已经存在,我不希望它作为新行被输入。CakePHP:覆盖现有的重复数据

正在保存的数据也是动态生成的,所以退出时出错并不合适。

编辑 Initally我保存的数据是在一个单一的大阵

$data = Array([0] => 'value1', [1] => 'value2', [2] => 'value3') etc 

我通过这个数组试图循环,节省了每个值作为一个新的记录

foreach ($data as $value) { 
    $save_data['Model'] = array('field' => $value); 
} 
Classregistry::init('Model')->saveAll($save_data); 

我正在使用Classregistry,因为我正在将数据保存到不同的模型。目前,当试图插入重复记录时,此代码会变得很糟糕,因为'field'是唯一的索引。在使用CakePHP之前,我只是使用了REPLACE INTO语法而没有任何问题。我想在Cake中实现类似的功能。

我目前唯一的解决办法是允许输入重复的,但只有将它们分组显示唯一行。

回答

0

指定数据的主键:

// create a new record 
$this->Model->create(); 
$this->Model->save(array(
    'Model' => array(
    'name' => 'new record' 
) 
)); 

// update it 
$this->Model->save(array(
    'Model' => array(
    'id' => $id, 
    'name' => 'updated record' 
) 
)); 

在你编辑的观点,简单地说:

echo $this->Form->input('id'); // or your custom PK field 
+0

值得注意的有这样做的其他方式,如前设置模型上的'id' PARAM做保存。 – jeremyharris 2012-04-12 15:40:07

+1

我不确定我是否清楚。我有大量未知大小的数据。我想循环数组并将每个条目保存为新记录,但避免插入重复项。 – Robert 2012-04-12 15:45:07

+0

同样的想法适用。你怎么知道它是独一无二的?你在大阵中有身份证吗?如果是这样,请使用它。否则,你需要循环查找其他一些独特的字段。您可能需要更改您的问题,并包含可能的数组值的片段。 – jeremyharris 2012-04-12 15:47:45

0

在CakePHP 3.0没有$这个 - >模型 - >创建() ;它会返回你未定义的错误。

,我们可以通过将数据类似像下面

foreach($sizeCategories as $sizeData){ 
 
\t 
 
\t $iteamData['Item_Code'] \t \t = 'abc-'.$sizeData->sizes_id; 
 
\t $iteamData['Item_Desc'] \t \t = ''; 
 
\t $iteamData['Article_ID'] \t = 0; 
 
\t $iteamData['ColorId'] \t \t = $colorData; 
 
\t $iteamData['CreatedBy'] \t = $this->request->session()->read('Auth.User.id'); 
 
\t $iteamData['CreatedDate'] \t = Time::now(); 
 
\t $iteamData['UpdateDate'] \t = Time::now(); 
 
\t $iteamData['Status'] \t \t = '1'; 
 
\t 
 
\t // Generaly we used $this->ItemMaster->patchEntity($itemMaster, $iteamData); that will update the data and overwrite the same entry again & again we should use the $this->ItemMaster->newEntity($iteamData); \t 
 
\t // save data in loop 
 
\t $itemMaster = $itemMaster = $this->ItemMaster->newEntity($iteamData); \t \t \t 
 
\t 
 
\t if ($this->ItemMaster->save($itemMaster)) { 
 
\t \t $this->Flash->success(__('The products has been generated.')); 
 
\t }else{ 
 
\t \t $this->Flash->error(__('The products could not be generate. Please, try again.')); 
 
\t } 
 
}