1

Cake で INSERT INTO の代わりに REPLACE 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 を使用しています。現在、「フィールド」は一意のインデックスであるため、重複するレコードを挿入しようとすると、このコードは失敗します。CakePHP を使用する前は、問題なく REPLACE INTO 構文を使用していました。私はケーキで似たようなことを達成したいと思います。

現時点での唯一の回避策は、重複を入力できるようにし、それらをグループ化して一意の行のみを表示することです。

4

2 に答える 2

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
于 2012-04-12T15:38:36.360 に答える
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.'));
	}
}

于 2016-02-20T11:19:50.110 に答える