2012-04-12 25 views
1

Wie kann ich Cake dazu bringen, REPLACE INTO anstelle von INSERT INTO zu verwenden? Ich habe eine Aktion, die Daten in der Datenbank speichert, aber ich möchte keine doppelten Einträge haben. Die Primärschlüssel (id) sind eindeutig, wenn der Wert bereits existiert Ich möchte nicht, dass er als neue Zeile eingegeben wird.CakePHP: Vorhandene doppelte Daten überschreiben

Die Daten, die gespeichert werden, werden auch dynamisch generiert, daher wäre das Beenden mit einem Fehler nicht geeignet.

EDIT Initally die Daten, die ich bin Speichern ist in einem einzigen großen Array

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

Ich versuche, durch diese Anordnung eine Schleife, um jeden Wert als neuer Datensatz gespeichert

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

Ich verwende Classregistry, weil ich die Daten in einem anderen Modell speichern. Zur Zeit schlägt dieser Code fehl, wenn versucht wird, einen doppelten Datensatz einzufügen, weil 'Feld' ein eindeutiger Index ist. Vor der Verwendung von CakePHP habe ich einfach die REPLACE INTO-Syntax ohne Probleme verwendet. Ich würde gerne etwas ähnliches in Cake erreichen.

Die einzige Problemumgehung, die ich im Moment habe, ist die Eingabe von Duplikaten, die nur eindeutige Zeilen anzeigen, indem sie gruppiert werden.

Antwort

0

den Primärschlüssel in Ihre Daten angeben:

// 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' 
) 
)); 

In Ihrem bearbeiten Ansichten, einfach ausgedrückt:

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

Es ist erwähnenswert, es gibt andere Wege, dies zu tun, wie die Einstellung der 'id' param auf dem Modell vor speichern. – jeremyharris

+1

Ich bin mir nicht sicher, ob ich klar war. Ich habe eine große Datenmenge unbekannter Größe. Ich möchte das Array loopen und jeden Eintrag als neuen Datensatz speichern, aber Duplikate vermeiden. – Robert

+0

Die gleiche Idee gilt. Woher weißt du, ob es einzigartig ist? Hast du die ID in der großen Reihe? Wenn ja, benutze das. Andernfalls müssen Sie nach einem anderen eindeutigen Feld suchen. Möglicherweise müssen Sie Ihre Frage neu formulieren und ein Snippet möglicher Array-Werte einfügen. – jeremyharris

0

In CakePHP 3.0 gibt es keine $ this-> Model-> create() ; Es wird Ihnen einen undefinierten Fehler zurückgeben.

wir können es tun, indem sie die Weitergabe von Daten ähnlich wie unter

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

Verwandte Themen