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

Symfony PHP Discussion :

Injecter une valeur dans une clée étrangère [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut Injecter une valeur dans une clée étrangère
    Bonjour à tous
    voici comment se présente les choses:
    un commentateur peut écrire un à plussieur commentaire.
    un commentaire a été écris par un et un seul commentateur.
    les entité ont été générer automatiquement de ma base de données.

    Le problème c'est que je n'arrive pas à remplir la clée étrangère idcommentateur de la table commentaire.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $commentateur = $commentaire->getCommentateur();
                    $commentaire->setIdcommentateur($commentateur->getIdcommentateur());
                    $em = $this->getDoctrine()->getManager();
     
                    $idcommentateur = $commentateur->getIdcommentateur();
     
                    $commentaire->setIdcommentateur($idcommentateur);
     
                    // On persist
     
                    $em->persist($commentaire);
                    $em->persist($commentateur);
     
                    $em->flush();
    Commentateur est bien enregistrer mais commentaire qui n'est pas enregistrer.

    Merci pour votre aide.

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Hello,

    Première chose flagrante et on ne le dira jamais assez : arrêtez de considérer vos objets comme des tables de base de données ça n'a rien à voir du tout.
    Si tu utilises Symfony il faut que tu comprennes à quoi sert l'objet : donc on ne parle pas de clés étrangères et on ne fait pas des attribut 'idtruc' et 'idmachin', parce que ce ne sont pas des id que tu reçois mais des objets. Tu fais de l'objet alors pense objet !!!
    Ton commentaire il ne possède pas un ID commentateur (en BDD oui, en objet non) : il possède un commentateur. Tout comme ton commentateur possède une collection de commentaires, pas une collection d'id de commentaires.

    Deuxième chose : ça ne sert à rien de persister des objets qui existent déjà en base (à moins que tu les aies détaché). Dans ton cas je veux bien admettre que le commentaire soit nouveau, mais pas le commentateur : le persist sur commentateur ne sert à rien. En principe tout ce que tu as à faire c'est récupérer ton commentaire : lui affecter un objet commentateur (avec la méthode setCommentateur() et pas setCommentateurId() qui ne devrait pas exister) et faire un persist/flush uniquement sur ton commentaire.

    Dernière précision : un petit rappel de la documentation de doctrine concernant l'enregistrement des changements :
    Doctrine will only check the owning side of an association for changes.
    ManyToOne is always the owning side of a bidirectional association.
    [EDIT] Ah nan : en fait y a encore une dernière chose : ton morceau de code n'a pas de sens. Je te détaille juste quelques lignes pour que tu réalises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // En tant que commentaire je possède déjà un commentateur et je le récupère (jusque là OK)
    $commentateur = $commentaire->getCommentateur();
    // J'aimerais que dans ce commentaire, on place le commentateur que je viens à l'instant de récupérer (et donc qui à priori s'y trouve déjà).
    $commentaire->setIdcommentateur($commentateur->getIdcommentateur());
    // ...
    // J'ai déjà une variable $commentateur mais je veux récupérer son id avec non pas une méthode getId() classique mais getIdCommentateur() ... va savoir pourquoi
    $idcommentateur = $commentateur->getIdcommentateur();
    // Je refais exactement la même action que la deuxième ligne mais cette fois j'ai mis $idcommentateur dans une variable
    $commentaire->setIdcommentateur($idcommentateur);
    [RE-EDIT] J'ai menti, c'était pas vraiment la dernière en fait. Si vraiment ton commentateur ET ton commentaire son nouveau, persister un nouveau commentaire possédant un nouvel objet commentateur doit suffire à enregistrer les deux en base si tu as correctement configuré tes évènements en cascade dans la configuration de ton entité (sur le persist au moins).

    ++

  3. #3
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Rebonjour et merci pour l'aide que vous pouvez m'accorder.

    J'ai refait le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    $commentaire = new Commentaire();
            $commentateur = new Commentateur();
     
     
            $form = $this->createForm(new CommentaireType(), $commentaire);
     
            $request = $this->get('request');
     
     
            if ($request->getMethod() == 'POST') {
                $form->bind($request);
                if( $form->isValid() )
                {
     
                    $commentateur = $commentaire->getCommentateur();
     
                    $em = $this->getDoctrine()->getManager();
     
     
                    //$em->persist($commentateur);
                    $em->persist($commentaire);
                    $em->flush();
     
     
     
                    return $this->redirect($this->generateUrl('_LaLingerie_accueil'));
     
                }
            }
            return $this->render('LaLingerieBundle:Default:index.html.twig',array(
                    'form' => $form->createView()));
     
        }
    Après validation du formulaire la page du formulaire réapparait.
    Hors les données ne sont pas enregistrer dans la bas de données.

    Merci.pour votre attention.

  4. #4
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Après validation du formulaire la page du formulaire réapparait. Hors les données ne sont pas enregistrer dans la bas de données.
    J'ai envie de te dire : LOGIQUE ... ça veut dire que ton formulaire n'est pas valide. Mais sans le code du form type, de la validation et le/les messages d'erreur on ne peut pas plus t'aider.

    Il y a toujours de grosses incohérences dans ton code : tu déclares un new Commentateur() que tu n'utilises nulle part. (ligne 3)
    Tu récupères le commentateur de ton commentaire alors que celui-ci n'en possède pas encore (ligne 16 ... mais bon tu ne l'atteins pas vu que ton form n'est pas valide).
    Si la page de ton formulaire réapparait mais que tu ne vois aucune erreur alors que le form n'est pas valide c'est que tu n'affiches aucun message d'erreur en cas d'échec de la validation : en afficher t'aiderait à comprendre ce qui cloche.

  5. #5
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    En général, tu devrais avoir un code comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (form->valid()){
        $id = "ton id d'utilisateur connecté";
        $commentateur = $em->getRepository("tonbundle.Commentateur")->find($id);
        if(null== $commenteur){
             $commentateur = new Commentateur("un nom");
        }
       $commentaire->setCommentateur($commentateur);
       $em->persist();
       $em->flush();
       $em->clear();
    }
    En général, ta table commentateur est en fait ta table User, par exemple celle de Fos User.

    Pierre

  6. #6
    Membre averti Avatar de Philcmoi
    Homme Profil pro
    Inscrit en
    Juillet 2006
    Messages
    632
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 632
    Points : 405
    Points
    405
    Par défaut
    Merci pour vos aides. Je met résolu.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. Réponses: 1
    Dernier message: 20/05/2008, 18h08
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 1
    Dernier message: 25/09/2006, 17h15
  5. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19

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