8
votes

CakePHP Enregistrez une association de relations à trois modèles

J'ai la sortie suivante que je dois être insérée dans la base de données: xxx

brièvement, chaque test Hasmany questions et chaque question hasmany répond avec chaque modèle associé ayant une clé étrangère Ce qui doit être réglé par gâteau (chaque question a un test_id, et chaque réponse a une question_id).

Le problème est que lorsque je $ ceci-> Test-> SaveAll ($ données) ; , seul le test et les questions sont sauvegardées, pas les réponses.

Comment puis-je enregistrer toutes les données, dans la définition automatique de la clé étrangère de chaque modèle associé? < p> merci!


0 commentaires

3 Réponses :


5
votes

Je ne suis pas sûr, mais je pense qu'il est impossible d'enregistrer une relation de troisième niveau.

de CakePHP:

Sauvegarde des données connexes avec SaveAll () ne travaillera que pour directement associé Modèles.

Vous devrez récupérer des données de troisième niveau et les sauver d'eux.


2 commentaires

SaveAll () fera 1) des lignes multiples du même modèle 2) un modèle principal et toutes ses relations directes. La 3ème rangée devra être faite manuellement.


Oh ... ce n'est pas la réponse que j'espérais. Alors, je vais devoir le faire manuellement. Je pensais que c'était une approche plus caky d'enregistrer un nombre n de niveaux de relation modèle. Merci!



1
votes

J'ai trois modèles A, B et C

A hasMany B B hasMany C p>

$ A-> saveAll () modélisera sauver A & B mais pas C p>

Voici une utilisation playaround I: p>

dans le modèle B remplacer afterSave comme ceci p>

function afterSave($created) {
    if ($created) { // check if we are in save not update
        $this->data['B']['id'] = $this->id;
        $this->data['C'] = $this->data['B']['C'];
        $this->saveAll($this->data);
    }
}


1 commentaires

Merci, ressemble à une bonne solution, mais depuis CakePHP 2.1, vous pouvez enregistrer des modèles de la profondeur que vous voulez, pas de niveau de matière ou récursivité.



4
votes

Oui, vous pouvez sauver des arbres modèles profonds depuis CakePHP 2.1 cette façon

$this->SomeModel->saveAll($data, array('deep' => true));


1 commentaires

Merci pour votre réponse. Heureux cela a été corrigé :)