CakePHP:覆盖现有的重复数据

时间:2012-04-12 15:31:17

标签: cakephp duplicates overwrite

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

正在保存的数据也是动态生成的,因此退出错误是不合适的。

EDIT 最初我保存的数据是一个大型数组

$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中实现类似的东西。

我目前唯一的解决方法是允许输入重复项,但只能通过分组显示唯一行。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

在cakephp 3.0中没有$ this-> Model-> create();它会返回你未定义的错误。

我们可以通过传递类似下面的数据

来实现



foreach($sizeCategories as $sizeData){
	
	$iteamData['Item_Code']		= 'abc-'.$sizeData->sizes_id;
	$iteamData['Item_Desc']		= '';
	$iteamData['Article_ID']	= 0;
	$iteamData['ColorId']		= $colorData;
	$iteamData['CreatedBy'] 	= $this->request->session()->read('Auth.User.id');
	$iteamData['CreatedDate'] 	= Time::now();
	$iteamData['UpdateDate']  	= Time::now();
	$iteamData['Status']  		= '1';
	
	// 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);	
	// save data in loop 
	$itemMaster = $itemMaster = $this->ItemMaster->newEntity($iteamData);			
	
	if ($this->ItemMaster->save($itemMaster)) {
		$this->Flash->success(__('The products has been generated.'));
	}else{
		$this->Flash->error(__('The products could not be generate. Please, try again.'));
	}
}