IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

enregistrement dans 2 tables. [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut enregistrement dans 2 tables.
    Bonjour à tous

    Alors voilà je bloque sur un petit problème ..

    J'ai un formulaire, et j'aimerais que certains champs de se formulaire soient enregistrés dans 2 tables.

    J'ai mon 'Model' Post, mon 'Controller' PostsController, et ma vue c'est un formulaire avec 5 champs (id (en auto-increment), ref, intervenant, date, chiffre).

    Donc ces 5 champs sont sauvegardés dans ma table posts, mais j'aimerais qu'au passage les champs id, intervenant et date soient enregistrés dans une autre table également.

    Est-il possible d'enregistrer un même champs dans 2 table ? J'ai pour idée, dans mon 'model' Post, de faire un aftersave, de récup les data comme ci-dessus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public function afterSave($created, $options = Array()) { 
    		$id = $this->data['Post']['id'];
    		$intervenant = $this->data['Post']['intervenant'];
    		$date = $this->data['Post']['date'];
     
    		$this->AutreModel->save(array('id' => $id, 'intervenant' => , 'date' => $date));
                    //ou
    		$this->AutreModel->create(array('id' => $id, 'intervenant' => , 'date' => $date));
    }
    mais pour cela je dois lier mes 2 models par une association et c'est sur ça que je bloque avec cakephp ... et surtout qu'elle type d'association utiliser entre les deux ? ça serait une hasOne non ? mais en cakephp malgré avoir lu plusieurs fois la doc sur les association ça ne fonctionne pas :/

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Hello !

    Déjà es-tu sur de ta modélisation ? C'est incorrect au niveau normalisation de faire ce que tu souhaites (dupliquer des informations identiques dans deux tables distinctes, si tu modifies une valeur mais pas l'autres => problème).

    En effet la bonne méthode est de lier des deux tables avec une clef étrangère, pourquoi ne fais-tu pas comme cela ?
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Non justement je dois les dupliquer car une table sera modifiée, alors que l'autre servira d'historique pour se rappeler des valeurs de base. Seul l'id restera fixe pour les 2 ce qui permettra de faire les comparaisons.

    Ben j'ai essayé de les lier mais sans succès (j'ai déjà fait et réussi avec cakephp des relation hasmany/belongsto mais là je bloque). Vu que pour chaque enregistrement les id sont unique, il me semble que c'est une relation hasOne qu'il faut non ? j'ai mis dans ma table 'posts' un champs AutreModel_id (qui est égal à l'id de posts) et dans mon AutreModel.php j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public $hasOne = 'Post' => array(
                'className' => 'Post',
                'foreignKey' => 'AutreModel_id'
            );
    mais après dans mon model Post.php j'ai mis ça dans mon afterSave :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    $id = $this->data['Post']['id'];
    		$this->updateAll(array('AutreModel_id' => $id), array('id' => $id )); // ça met la correspondance entre les id
    		$this->Register->save(array('id' => $this->data['Post']['AutreModel_id'],
                                                            'date' => $this->data['Post']['date'],
                                                            'intervenant' => $this->data['Post']['intervenant'],
                                                             ));
    mais j'ai l'erreur : Error: Call to a member function save() on a non-object, qui est l'erreur lorsque la relation entre les table n'est pas faite :/

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Seul l'id restera fixe pour les 2 ce qui permettra de faire les comparaisons.
    Ceci est toujours incorrect du point de vue de la normalisation. L'identifiant de la table historique peut-être différent de la table 'Post', c'est une clef étrangère qui doit faire la liaison entre les deux tables, pas la valeur de l'id.

    ET oui c'est bien relation hasOne entre c'est deux tables (relation de cardinalités 1,1 <=> 1,1)
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Ok merci de me confirmer la relation

    c'est une clef étrangère qui doit faire la liaison entre les deux tables, pas la valeur de l'id.
    C'est pour ça que dans le table posts j'ai fait un champ clef étrangère AutreModel_id

    dans posts j'ai =============> id, ref, intervenant, date, chiffre, autremodel_id
    et dans autremodel j'ai =======> id, intervenant, date


    et donc j'essaie de créer le lien hasOne entre autremodel_id (de la table posts) et id (de la table autremodel)

    le code que j'ai mis dans mon post précédent (pour la déclaration de la relation hasOne) est-il correct ? Je l'ai fait en suivant la doc mais la relation n'est pas établie puisque j'ai l'erreur citée précédemment aussi :/

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Il y a une erreur dans la déclaration de la relation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public $belongsTo = array(
            'Post' => array(
                'className' => 'Post',
                'foreignKey' => 'autre_model_id'
            )
        );
    D'autre part, une relation hasOne implique une clef étrangère dans les deux modèles associés. Il te faut donc faire la même chose dans le modèle lié.

    Ensuite, voici comment pourrait se faire ton afterSave :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public function afterSave($created, $options = array()) {
            if ($created) {
                $this->Register->create();
                $data = array(
                    'date' => $this->data['Post']['date'],
                    'intervenant' => $this->data['Post']['intervenant'],
                    'post_id' => $this->id
                );
                $this->Register->save($data);
            }
        }
    Après, il reste à mettre à jour l"autre _model_id" dans Post. Ca se fait dans le afterSave de Register :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public function afterSave($created, $options = array()) {
            if ($created) {
                $this->Post->updateAll(array('autre_model_id' => $this->id), array('id' => $this->data['Register']['post_id']));
            }
        }

    Après ce n'est clairement pas le moyen le plus simple pour gérer tout ceci. Il y a quelque chose de possible à faire dans le beforeSave de Post, pour peu que tu l'enregistres avec 'saveAssociated'.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 40
    Points : 22
    Points
    22
    Par défaut
    Ah oui faut le faire dans les 2 Models impliqués ... ça marche nickel ! Je pensais que la déclaration dans l'un l'impliquait dans l'autre :/

    et merci pour le "array (" oublié au début de ma déclaration j'avais même pas remarqué !

    Merci beaucoup d'avoir pris le temps de m'aider et de me conseiller ça fait plaisir !

    Bonne journée à toi !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD9] Cliquer sur des enregistrements dans une table
    Par oz80 dans le forum WinDev
    Réponses: 2
    Dernier message: 15/12/2005, 20h11
  2. Nombre d'enregistrement dans une table MySQL
    Par tom06440 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 21/10/2005, 19h07
  3. AJOUT d'un ENREGISTREMENT dans UNE TABLE
    Par ramo dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/08/2005, 16h24
  4. Enregistrement dans 2 tables à la fois
    Par martonpylon12 dans le forum Access
    Réponses: 12
    Dernier message: 21/06/2005, 17h42
  5. Réponses: 9
    Dernier message: 27/10/2004, 01h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo