2010-11-18 11 views
0

Völlig neu zu Cake.CakePHP: hasOne verwandte Tabelle speichert mehrere Einträge bei Aktualisierungen

Ich habe diese Tabelle namens Content und eine andere mit dem Namen ContentMeta (über content_id bezogen). Jeder Eintrag im Content hat eine entsprechende ContentMeta.

Wenn ich neue Inhalte hinzufügen, das ist der Code, den ich einen neuen Eintrag zu ContentMeta hinzufügen bin mit:

if(!empty($this->data)) { 

// Save Content 
$this->Content->create(); 
$content = $this->Content->save($this->data); 
// Save Meta 
if(!empty($content)) { 
    $this->data['ContentMeta']['content_id'] = $this->Content->id; 
    $this->Content->ContentMeta->save($this->data); 
    $this->Session->setFlash('Content has been saved.'); 
    $this->redirect(array('action' => 'edit', $this->Content->id)); 
} 
} 

Dies funktioniert gut, und fügen Sie einen neuen Eintrag zu Inhalt und eine zu ContentMeta.

Wenn es um die Aktualisierung der Daten geht (Bearbeitungsmodus), stoße ich auf ein kleines Problem. Der Eintrag für den Inhalt wird ohne Probleme aktualisiert, aber in der Tabelle ContentMeta wird bei jedem Update ein neuer Eintrag erstellt.

Hier ist der Code für die Aktualisierung:

$this->Content->id = $id; 
// Update Content 
$content = $this->Content->save($this->data); 
// Update Meta 
if(!empty($content)) { 
    //Debugger::dump(print_r($this->data,true)); 
    $this->data['ContentMeta']['content_id'] = $this->Content->id; 
    $this->Content->ContentMeta->save($this->data); 
    $this->Session->setFlash('Content has been updated.'); 
    $this->redirect(array('action' => 'edit', $this->Content->id)); 
} 

Ich bin sicher, dass es einige logische Fehler in diesem Block, der dies geschehen verursacht. Kann mir jemand eine Idee geben, wo ich falsch liege?

Danke, m^e

Antwort

2

Für mich ist es $ this-> data [ 'ContentMeta'] [ 'id'] in Ihrer Datenfeld fehlt. Und weil dieses Feld leer ist, versucht der Kuchen, eine neue Reihe zu erstellen.

Fügen Sie in Ihrem Formular ein verstecktes ID-Feld für die ContentMeta hinzu.

Eine andere Sache, die ich denke, Ihren Code zu verbessern ist

$this->Content->saveAll($this->data); 

diese Art und Weise zu verwenden, werden Sie Ihre Daten auf einmal anstelle von 2 save() ruft für jedes Modell zu speichern. Überprüfen Sie das Handbuch in the cookboook (und suchen Sie nach saveAll im Text).

+0

Perfekt. Das hat den Job gemacht und saveAll half dabei, den Code zu reduzieren. Ich bin früher auf saveAll gestoßen, habe es aber vermieden, es zu benutzen, bis ich die einzelnen Schritte manuell ausprobiert habe. Danke Nik :) –

+0

alles saveAll ist Aufruf save() ein paar Mal (gut __save()), aber es tut den Code aufräumen – dogmatic69

Verwandte Themen