2010-10-24 7 views
2

J'essaye de construire un système d'invitation avec CakePHP. J'ai le modèle d'Invitation qui a beaucoup de gens, et la personne a One et appartient à l'invitation. Je crois que les relations fonctionnent, puisque ma vue d'index d'invitations peut accéder correctement et afficher ses personnes associées à travers le modèle d'invitation. Mais voici ce que les règles de relations ressemblent:Enregistrement de plusieurs modèles dans CakePHP avec saveAll()

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array(
     'People' => array(
      'className' => 'Person', 
      'foreignKey' => 'invitation_id', 
      'dependent'=> true 
     ) 
    ); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $hasOne = 'Invitation'; 
    var $belongsTo = 'Invitation'; 

    ... 
} 

MIS À JOUR MODÈLE: RELATIONS

class Invitation extends AppModel { 

    var $name = 'Invitation'; 
    var $hasMany = array('Person'); 

    ... 
} 

class Person extends AppModel { 

    var $name = 'Person'; 
    var $belongsTo = array('Invitation'); 

    ... 
} 

Dans ma fonction d'invitation ajouter, cependant, je ne parviens pas à enregistrer les données de nouvelles personnes. Je veux ajouter simultanément une invitation et deux personnes.

Heres ma fonction ajouter:

function add() { 

     $this->autoRender = false; 

     if($this->RequestHandler->isAjax()) { 

      $this->layout = 'ajax'; 

      if(!empty($this->data)) { 

       $this->Invitation->create(); 

      if($this->Invitation->saveAll($this->data)) { 

        //debug($this->data);  

        $this->Session->setFlash('Saved'); 
        $this->redirect('invitations/add_invitations'); 

       } else { 

        echo('Didnt save<br />'); 

       } 

     } 
     } 

} 

Voici la sortie de mon debug ($ this-> data):

Array 
(
    [Invitation] => Array 
     (
      [code] => 001 
      [password] => 85c8a3735499bf91d25e5960ab4ed9deeb0b457e 
      [type] => 1 
      [num_people] => 2 
     ) 

    [Person] => Array 
     (
      [0] => Array 
       (
        [fname] => Jane 
        [lname] => Doe 

       ) 

      [1] => Array 
       (
        [fname] => John 
        [lname] => Doe 
       ) 

     ) 

) 

Je ne reçois pas d'erreurs. Les données d'invitation sont enregistrées correctement, mais les personnes ne le sont pas. MISE À JOUR: J'ai finalement réussi à travailler avec les relations de modèles mises à jour ci-dessus. Évidemment les règles hasOne & belongsTo dans le modèle Person étaient en conflit. Après que j'ai fait une erreur (un embarrassant) qui empêchait d'enregistrer lié le modèle de personne liée:

Dans le modèle d'Invitation, j'ai hade $ hasMany = array ('People'); quand il aurait dû être $ hasMany = array ('Person').

J'ai également dû modifier la configuration de ma base de données pour utiliser InnoDB par défaut, ce qui était certainement une solution nécessaire.

+0

Je suppose que vos personnes ne réussissent pas les tests de validation. Avez-vous une table 'people'? – bancer

+0

Essayez 'debug ($ this-> Invitation-> invalidFields())' après l'opération de sauvegarde. – deceze

+0

J'ai bien sûr une table "people", avec un champ invitation_id. Le débogage comme ci-dessus produit un tableau vide, donc je suppose que cela signifie que les données ont été validées. –

Répondre

1
var $hasOne = 'Invitation'; 
var $belongsTo = 'Invitation'; 

Ces relations avec le même modèle devraient avoir des alias autrement Cake se confondre, comme je l'ai essayer de défaire ce. Voir http://book.cakephp.org/view/1046/Multiple-relations-to-the-same-model

+0

Intéressant. Après avoir regardé de plus près les types de relations, j'ai enlevé la règle "Personne a Invitation", et maintenant je n'ai plus que la "Personne qui M'appartient", puisqu'il n'y a qu'une seule relation ici. J'ai essayé ceci sans règle de relation dans le modèle Invitation, ainsi que "Invitation hasMany People", et les deux cas obtiennent le même résultat: les données d'invitation sont sauvegardées, et les données de personnes ne le sont pas. –

+0

Aussi ... J'ai essayé de séparer la sauvegarde du modèle, et en utilisant $ this-> Invitation-> Person-> saveAll ($ this-> data ['Person']), et cela me donne une erreur: propriété non définie Invitation :: $ Person ... ou quelque chose comme ça. Cela semble suggérer que les relations ne sont pas correctement définies, puisque Personne n'est pas disponible sur Invitation. –

+0

A partir du livre sur saveAll(): "atomic: Si true (par défaut), tentera de sauvegarder tous les enregistrements dans une seule transaction Devrait être défini sur false si database/table ne supporte pas les transactions Si false, nous retournons un tableau similaire au tableau de données $ passé, mais les valeurs sont définies sur true/false selon que chaque enregistrement a bien été enregistré ou non - vous ne pouvez pas utiliser un moteur transactionnel: "http://dev.mysql.com /doc/refman/5.0/fr/ansi-diff-transactions.html – Leo

Questions connexes