2011-01-10 3 views
0

Ich möchte, dass die Join-Tabelle automatisch aktualisiert/gelöscht wird. Ich mache eine deleteAll() vor saveAll() als eine Umgehung, um dies zu tun.CakePHP saveAll() löscht oder aktualisiert die Join-Tabelle nicht

Wenn ich das Formular absende, werden die Layout- und Komponentenmodelle korrekt aktualisiert, aber das Layoutkomponentenmodell (die Join-Tabelle) fügt neue Daten ein (was ich will), löscht jedoch nicht die referenzierten Daten.

Layout-Modell:

class Layout extends AppModel { 
    var $name = 'Layout'; 

    var $hasMany = array(
     'LayoutComponentOrder' => array(
      'className' => 'LayoutComponentOrder', 
      'foreignKey' => 'layout_id', 
      'dependent' => false, 
      'order' => 'LayoutComponentOrder.sort_id ASC', 
     ), 
     'ComponentVideo' => array(
      'className' => 'ComponentVideo', 
      'foreignKey' => 'layout_id', 
      'dependent' => false, 
     ), 
);} 

Component Model:

class ComponentVideo extends AppModel { 
    var $name = 'ComponentVideo'; 
    //The Associations below have been created with all possible keys, those that are not needed can be removed 

    var $hasMany = array(
     'LayoutComponentOrder' => array(
      'className' => 'LayoutComponentOrder', 
      'foreignKey' => 'layout_component_id', 
      'dependent' => false, 
     ), 
    ); 

    var $belongsTo = array(
     'Layout' => array(
      'className' => 'Layout', 
      'foreignKey' => 'layout_id' 
     ), 
    ); 
}; 

Layout-Komponenten-Modell (Join-Tabelle):

class LayoutComponentOrder extends AppModel { 
    var $name = 'LayoutComponentOrder'; 
    var $uses = 'layout_component_orders'; 

    //The Associations below have been created with all possible keys, those that are not needed can be removed 

    var $belongsTo = array(
      'Layout' => array(
       'className' => 'Layout', 
       'foreignKey' => 'layout_id' 
      ), 
      'ComponentVideo' => array(
       'className' => 'ComponentVideo', 
       'foreignKey' => 'layout_component_id' 
      ) 
     ); 
} 

Layout-Controller:

// deleting the data manually 
$this->LayoutComponentOrder->deleteAll(array('LayoutComponentOrder.layout_id' => $layout_id)); 
// this one inserts into the tables including the join table   
$this->Layout->id = $layout_id; 
if ($this->Layout->saveAll($this->data)) { 
    $this->Session->setFlash(__('The layout has been saved', true)); 
} 

Wie kann ich den Join automatisch löschen lassen? Ist das mit CakePHP möglich?

Antwort

1

Leider ist dies nicht in CakePHP saveAll für hasMany Beziehungen integriert. Ich wünschte, es wäre, als ich diese Seite gefunden habe, auf der Suche nach einer Lösung für die gleiche Sache.

Es scheint jedoch mit HABTM-Beziehungen eingebaut zu sein.

Siehe Is there a way to make saveAll() remove extraneous objects? und Shouldn't saveAll remove associated records as well?).

Sie müssen Ihre eigene Lösung implementieren (Meine schnelle Lösung führt eine deleteAll vor der saveAll, wenn das Formular validiert. Dies ist jedoch nicht ideal, denn wenn es einen Fehler nicht im Zusammenhang mit Formularvalidierung gibt, verlieren Sie die bestehende zugehörige Artikel).

0

Vielleicht verstehe ich die Frage nicht, aber reden wir über das Entfernen von Joins, wenn ein Eltern-Datensatz aus Cake entfernt wird? Es tut das, wenn in den Modellbeziehungen konfiguriert mit dem ‚abhängig‘ Parameter:

abhängig: Wenn der abhängigen Schlüssel auf true gesetzt ist, und das Modell des löschen() -Methode mit dem Kaskaden-Parametersatz aufgerufen wird Wahr, zugeordnete Modelldatensätze werden ebenfalls gelöscht. In diesem Fall setzen wir es auf true, sodass das Löschen eines Benutzers auch das zugehörige Profil löscht.

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

Ist das, was Sie suchen?