2013-03-27 4 views
-2

J'ai rencontré un peu de problème en enregistrant des données dans le gâteau php.cakephp enregistrement des données pour le modèle associé d'un modèle associé (pas de faute de frappe)

Voici les modèles/relations.

  • District hasMany Départements
  • Département hasMany Groupes

Je suis dans une vue de la création d'un nouveau quartier, où j'ai permis à l'utilisateur de créer plusieurs nouveaux départements. lors de la création de chaque département, l'utilisateur peut créer plusieurs groupes pour ce département. Maintenant, le problème est que je ne suis pas sûr de la façon de sauvegarder les données du groupe.

pour chaque département créé à la volée, en utilisant la méthode de l'index multiple pour les entrées (par exemple, "Department.0.name", Department.0.type), ce sera donc un jeu d'enfant à sauvegarder en utilisant saveAll méthode. Cependant, pour chaque groupe créé, j'ai besoin d'un department_id, et comme aucun des départements du District n'a encore été sauvegardé, ils n'ont pas d'identifiant. Comment puis-je sauvegarder les données de ce nouveau district, en sauvegardant les nouveaux départements et leurs nouveaux groupes associés? Y a-t-il une manière que je peux adresser l'attribut de nom des entrées de groupe qui créeront l'association appropriée, quelque chose comme "Department.0.Group.0.name", par exemple?

Merci d'avance !!! si quelque chose n'est pas clair, n'hésitez pas à le dire, je me ferai un plaisir de le reformuler.

Répondre

2

À quoi ressemble votre tableau de données POST?

<?php 

debug($this->data); 

?> 

Si ce n'est pas dans le bon format, les modèles associés ne seront pas sauvegardés .. gâteau sait saisir le « lastInsertId() » des modèles qui ne sont pas encore sauvés, vous don Ne vous inquiétez pas pour ceux ... Ce dont je ne suis pas sûr, et les docs ne vont pas vraiment, c'est la profondeur de la sauvegarde. L'exemple fourni est la suivante:

$this->data = 
Array 
(
    [Article] => Array 
     (
      [title] => My first article 
     ) 
    [Comment] => Array 
     (
      [0] => Array 
       (
        [comment] => Comment 1 
        [user_id] => 1 
       ) 
      [1] => Array 
       (
        [comment] => Comment 2 
        [user_id] => 2 
       ) 
     ) 
) 

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

Ceci est la structure correcte (CakePHP 1.3) pour la sauvegarde des modèles associés d'une relation « hasMany », mais je ne suis pas sûr si elle va plus profond d'un enfant. Une des choses qui me vient à l'esprit est de construire le tableau selon le format ci-dessus, mais laissez le modèle parent à l'extérieur. Enregistrez ensuite manuellement les données du modèle parent, récupérez le :: getLastInsertId(); Ensuite, faites un saveAll sur les départements et les groupes.


[MISE A JOUR ] Je viens de tester votre théorie et il fonctionnera de la façon dont vous avez l'intention.

<?php 

echo $this->Form->input('Department.0.Group.0.name'); 

?> 

va émettre:

<input name="data[Department][0][Group][0][name]" type="text" id="Department0Group0name"> 

[MISE À JOUR 2] je l'ai fait une exploration dans lib/gâteau/modèle/model.php et trouvé ceci:

<?php 
... 

public function saveAssociated($data = null, $options = array()) { 
    ... 
    ... // code omitted. 
    ... 
    if ($options['deep']) { // This will recurse infinitely through all associations 
     $saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false))); 
    } 
    ... 
    ... 
    ... // code omitted. 
... 
?> 
+0

Merci!En ce qui concerne saveAll, si je comprends bien, cela permettra d'enregistrer les données du modèle et les données de modèle associées. Donc, de ce qui précède, cela permettrait de sauver tout cela. saveAll est un wrapper pour plusieurs méthodes de sauvegarde, dont saveAssociated(). En ce qui concerne la profondeur, pour enregistrer des données pour les modèles associés aux modèles associés, je crois que vous pourriez utiliser saveAssociated ($ data, array ('deep' => true)). Je crée les entrées manuellement pour le groupe dans une vue d'une action de district. Pourrais-je définir l'attribut name à ', je me demande? – Todd

+0

Cela semble juste, 'profond' => vrai hein? Je n'ai jamais utilisé ça, bonne idée. Je crois que votre nom d'entrée est valide et je crois qu'il va créer la bonne structure. ' Form-> input ('Modelname.0.fieldname'); echo $ this-> Form-> input ('Modelname.1.fieldname'); ?> ' –

+1

Limitations de profondeur d'entité 'Dans 1.2, il y avait une limite stricte de 5 clés imbriquées. Cela a posé des limitations importantes sur la création d'entrées de formulaire dans certains contextes. Dans 1.3, vous pouvez maintenant créer des clés d'élément de formulaire imbriquées à l'infini. Des erreurs de validation et des lectures de valeurs pour des profondeurs arbitraires ont également été ajoutées. On dirait que la limite est infinie :) –

Questions connexes