Domanda

Ho problemi con il mio rapporto HABTM in CakePHP.

Ho due modelli in questo modo: Department HABTM Location. Una grande azienda ha molti edifici, e ogni edificio offre un numero limitato di servizi. Ogni edificio ha anche una propria pagina web, quindi oltre alla relazione HABTM stesso, ogni riga HABTM ha anche un campo url cui l'utente può visitare il sito per trovare ulteriori informazioni sul servizio sono interessati e come funziona presso l'edificio si' ri interessato.

Ho creato i modelli in questo modo:

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

I controllori sono completamente priva di interesse.

Il problema: Se modifica il nome di un Location, tutti i DepartmentsLocations che erano legati a quel Location vengono ricreati con gli URL vuoti. Dal momento che i modelli precisano che unico è vero, questo fa sì che anche tutte le righe più recenti per sovrascrivere le righe più vecchie, che distrugge in sostanza tutti gli URL.

Vorrei sapere due cose: Posso fermare questo? Se sì, come?

E, su una nota meno tecnico e più lamentoso: Perché questo accada ancora? Sembra strano a me che la modifica di un campo attraverso torta dovrebbe causare così tanti problemi, quando posso facilmente passare attraverso phpMyAdmin, modificare il nome Location lì, e ottenere esattamente il risultato che ci si aspetterebbe. Perché CakePHP tocca i dati HABTM quando sto solo modificando un campo su una riga? Non è nemmeno una chiave esterna!

È stato utile?

Soluzione

dal ricettario del primo problema è:

  

Per impostazione predefinita quando si salva un   rapporto HasAndBelongsToMany, Torta   cancellerà tutte le righe sul tavolo join   prima di salvare quelli nuovi.

Non sono del tutto sicuro perché Cake sta cercando di salvare i dati HABTM anche se non si dispone di una chiave esterna nei dati, ma c'è una soluzione facile per questo. Semplicemente distruggere il associazione per la save chiamare:

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

Altri suggerimenti

Sto pensando di una ragione per cui questo potrebbe accadere. Quando si recupera Location, è anche recuperare i dati locations_departments. E quando lo fai un save($this->data) sembra per i modelli della serie e li salva.

Un modo per risolvere questo sta creando l'attributo recursive (di un modello) per -1 o 0 (provo, non sono sicuro, basta stampare il i dati per vedere cosa viene fuori). È possibile impostare nel modello: var $recursive = -1; o nel metodo di controllo (azione): $this->ModelName->recursive = -1;

Ulteriori informazioni ricorsiva: http://book.cakephp.org/view/439/recursive

E 'davvero simile a quello che Harpax ha suggerito, solo se non è necessario che i dati, dillo alla torta, in modo che esso non prenderlo.

Il problema è che quando si salva il Location, hai dato il metodo di salvare un array contenente tutti i DepartmentsLocations troppo. Così CakePHP distrugge tutto e cercare di ricrearlo.

Questo è un errore comune con la torta dal momento che spesso tirare troppi risultati per voi.

Assicurati di passare solo i dati che deve essere salvato, o meglio per andare a prendere solo i dati necessari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top