Frage

Ich habe Probleme mit meiner HABTM Beziehung in CakePHP.

Ich habe zwei Modelle in etwa so: Department HABTM Location. Ein großes Unternehmen hat viele Gebäude und jedes Gebäude bietet eine begrenzte Anzahl von Dienstleistungen. Jedes Gebäude auch eine eigene Webseite hat, so dass zusätzlich zu der HABTM Beziehung selbst, jede HABTM Reihe hat auch ein url Feld, in dem der Benutzer besuchen kann zusätzliche Informationen über den Service findet sie interessieren und wie es funktioniert auf dem Gebäude sie‘ interessiert sind in.

Ich habe die Modelle aufgebaut wie folgt:

<?php
class Location extends AppModel {
    var $name = 'Location';

    var $hasAndBelongsToMany = array(
        'Department' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>


<?php
class Department extends AppModel {
    var $name = 'Department';

    var $hasAndBelongsToMany = array(
        'Location' => array(
            'with' => 'DepartmentsLocation',
            'unique' => true
        )
    );
}
?>

<?php
class DepartmentsLocation extends AppModel {
    var $name = 'DepartmentsLocation';

    var $belongsTo = array(
        'Department',
        'Location'
    );    


    // I'm pretty sure this method is unrelated. It's not being called when this error
    // occurs. Its purpose is to prevent having two HABTM rows with the same location
    // and department.
    function beforeSave() {

        // kill any existing rows with same associations
        $this->log(__FILE__ . ": killing existing HABTM rows", LOG_DEBUG);

        $result = $this->find('all', array("conditions" =>
            array("location_id" => $this->data['DepartmentsLocation']['location_id'],
                  "department_id" => $this->data['DepartmentsLocation']['department_id'])));


        foreach($result as $row) { 
            $this->delete($row['DepartmentsLocation']['id']);
        }

        return true;
    }
}
?>

Die Regler sind völlig uninteressant.

Das Problem: Wenn ich den Namen eines Location bearbeiten, die alle die DepartmentsLocations, die zu diesem Location verknüpft wurden, sind neu erstellt mit leeren URLs. Da die Modelle angeben, dass einzigartig wahr ist, gilt dies auch alle neueren Reihen bewirkt, dass die älteren Reihen zu überschreiben, die im wesentlichen alle URLs zerstört.

Ich möchte zwei Dinge wissen: Kann ich das verhindern? Wenn ja, wie?

Und auf einer weniger technische und mehr whiney Anmerkung: Warum passiert das dies auch? Es scheint mir, bizarr, dass durch Kuchen ein Feld Bearbeitung sollte so viel Ärger verursachen, wenn ich dort leicht die Location Namen durch phpMyAdmin, bearbeiten gehen kann, und genau das bekommen, das Ergebnis, das ich erwarten würde. Warum berühren CakePHP die Daten HABTM, wenn ich nur ein Feld Bearbeitung auf einer Reihe? Es ist nicht einmal ein Fremdschlüssel!

War es hilfreich?

Lösung

aus dem Kochbuch das erste Problem ist:

  

In der Standardeinstellung beim Speichern eines   HasAndBelongsToMany Beziehung, Kuchen   löscht alle Zeilen auf dem Tisch beitreten   bevor neue zu speichern.

Ich bin nicht ganz sicher, warum Kuchen versucht, die HABTM Daten zu speichern, auch wenn Sie keine Fremdschlüssel in Ihren Daten haben, aber es gibt eine einfache Lösung dafür. Einfach den Verein für das zerstören speichern Aufruf:

$this->Location->unbindModel(
    array('hasAndBelongsToMany' => array('Department'))
);

Andere Tipps

Ich denke an ein Grund, warum dies geschehen könnte. Wenn Sie Location abzurufen, rufen Sie auch locations_departments Daten. Und wenn Sie einen save($this->data) tun sieht es für die Modelle in dem Array und speichert sie.

Ein Weg, dies zu lösen, ist die recursive Attribut Einstellung (eines Modells) zu -1 oder 0 (Versuch, ich bin sicher nicht, drucken Sie nur aus der Daten zu sehen, was herauskommt). var $recursive = -1; oder in der Controller-Methode (Aktion): Sie können es in dem Muster $this->ModelName->recursive = -1;

Weitere Informationen zu rekursiven: http://book.cakephp.org/view/439/recursive

Es ist wirklich ähnlich wie Harpax vorgeschlagen, nur, wenn Sie nicht brauchen, dass die Daten, so sage es Kuchen, so dass sie es nicht holen wird.

Das Problem ist, dass, wenn Ihr Location Speichern Sie die Save-Methode ein Array gab auch alle DepartmentsLocations enthält. So CakePHP zerstört alles und versucht, es neu zu erstellen.

Dies ist ein häufiger Fehler mit Kuchen, da sie oft viel zu viele Ergebnisse für Sie ziehen.

Achten Sie darauf, nur die Daten zu übergeben, dass der Bedarf gespeichert werden, oder besser holen nur die Daten die Sie benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top