Mysql
 sql >> Base de données >  >> RDS >> Mysql

CakePHP :Créer une nouvelle ligne HABTM à la place en met à jour d'autres

Ok, voici ce que je pense se passe :

Vous n'utilisez pas la magie de relation HABTM super utile. Au lieu de traiter cette table comme une simple table de relations, cake va au modèle défini et voit les relations que vous avez définies et les primaryKeys et displayFields, etc.

Ce n'est pas grave lorsque vous avez une table HABTM compliquée. Mais si c'est le cas, votre tableau de données est tout foiré, car vous n'ajoutez pas de Question et Qset séparément. Ce que je veux dire, c'est que tu ne fais pas

$data = array('Question'=>array('title'=>'new_question'),
              'Qset'=>array('name'=>'lets say qset'));
$this->Question->saveAll($data);

Ce faisant, vous laissez cake résoudre l'association HABTM pour vous, et cette structure de données serait correcte. Mais vous avez votre propre modèle QsetsQuestion dans votre dossier de modèle. Ainsi, les données que vous enregistrez doivent être comme avec n'importe quelle autre table, comme ceci

$data = array('qset_id'=> $qset_id,
              'question_id'=> $question_id);
$this->Question->QsetsQuestion->save($data);

Et cela crée un nouvel identifiant dans la table qsets_questions, avec la nouvelle relation, comme vous le souhaitez.

Soyez prudent, cependant, puisque vous utilisez votre propre modèle pour cela, si vous ne définissez pas correctement vos validations, vous pourriez avoir la même paire de clés étrangères plusieurs fois, car par défaut, cake vérifie simplement que l'id doit être unique .

[MODIFIER] Après quelques éclaircissements, la solution ci-dessus résout le "problème", mais n'est pas réellement la raison de ce comportement.

Cakephp a un Ce lien m'a aidé à comprendre les associations HABTM (recherchez "Challenge IV").

Je sais que la solution que j'ai donnée auparavant vous a aidé à résoudre le "problème", mais elle a été faite sous l'impression que vous aviez une QsetsQuestion fichier modèle quelque part. Puisque ce n'est pas le cas, la solution serait d'obtenir toutes les Questions associés et ajoutez-les en tant que nouveau tableau. Ou créer en fait une QsetsQuestion modèle, et faites les associations comme ceci :

Qset hasMany QsetsQuestion
QsetsQuestion belongsTo Qset, Question
Question hasMany Qsets.

Ou changer le comportement du gâteau... Aucun d'entre eux ne semble joli, je sais.

Donc, résumé des solutions :

  • Chaque fois que vous souhaitez enregistrer une nouvelle association Qset-Question, récupérez les associations précédemment enregistrées, mettez-la dans le tableau à enregistrer et enregistrez-les

    //find previously associated Qsets, lets say it's 1,2,3 and 4
    $data = array('Question'=>array('id'=>1),
              'Qsets'=>array('Qsets'=>array(1,2,3,4, $new_qset));
    $this->Question-save($data);
    

Notez qu'il n'y a pas de QsetsQuestion , puisqu'il n'existe pas. Cela devrait être la première option puisque le modèle HABTM n'est pas complexe

OU

  • Créer QsetsQuestion dans votre dossier modèle et modifiez les associations comme indiqué ci-dessus. La partie de sauvegarde sur le contrôleur serait

    $data = array('qset_id'=>1, 'question_id'=>1)
    $this->Question->QsetsQuestion->save($data);    //also works with $this->Qset->QsetsQuestion
    

C'est beaucoup plus simple (peut-être), mais vous devez créer un nouveau fichier, et n'oubliez pas de vérifier qu'il n'y a pas d'association similaire précédente (vérifiez si 2-2 tuple existe avant de l'insérer). Des règles de validation simples devraient fonctionner.

OU

  • Modifier le comportement de cakephp pour celui-ci... Je n'aime pas celui-ci.