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 :

Relation OneToMany : addImage() non appelé lors du persist()


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut Relation OneToMany : addImage() non appelé lors du persist()
    Bonjour amis développeurs !

    Je suis grand débutant sur symfony. Je suis actuellement un tutoriel symfony2 pour apprendre tout en me guidant dans mon projet, et cela fait plusieurs jours que je tourne en rond autour de mon soucis. J'ai eu beau chercher sur beaucoup de forums, mon problème est assez pointus et il m'a été difficile de trouver des topics pouvant m'aider (d'où ce titre de sujet assez peu explicite...). Je suis sûr que la nature de mon problème est bénigne ou tout simplement dûe à une mauvaise compréhension/utilisation du framework, mais toute aide et la bienvenue.

    Voici mon problème en tâchant d'être le plus clair possible:

    Contexte:
    Mon projet est de créer un site pour un groupe d'amis qui proposent des tests et émissions de jeux vidéos sur youtube.

    L'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    An exception occurred while executing 'INSERT INTO image (name, extension, videoGame_id) VALUES (?, ?, ?)' with params ["burnoutparadise.jpg", "jpeg", null]:
     
    SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'videoGame_id' cannot be null
    Localisé dans le l'action createAction de mon controlleur VideoGameController :
    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
    /**
         * Creates a new VideoGame entity.
         *
         * @Route("/", name="videogame_create")
         * @Method("POST")
         * @Template("NSTestsBundle:VideoGame:new.html.twig")
         */
        public function createAction(Request $request)
        {
            $entity = new VideoGame();
            $form = $this->createCreateForm($entity);
            $form->handleRequest($request);
     
     
            if ($form->isValid()){
                $em = $this->getDoctrine()->getManager();
                var_dump($entity->getImages());
     
                // *******   ICI   **********
                $em->persist($entity);
     
                var_dump($entity->getImages()); die();
                $em->flush();
     
                return $this->redirect($this->generateUrl('videogame_show', array('id' => $entity->getId())));
            }
     
            return array(
                'entity' => $entity,
                'form'   => $form->createView(),
            );
        }
    Avant la persistance de l'objet image, var_dump($entity->getImages()); me donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    object(Doctrine\Common\Collections\ArrayCollection)[301]
      private '_elements' => 
        array (size=1)
          0 => 
            object(NS\HomeBundle\Entity\Image)[1051]
              private 'videoGame' => null
              private 'id' => null
              private 'name' => string 'burnout' (length=7)
              private 'extension' => null
              private 'file' => 
                object(Symfony\Component\HttpFoundation\File\UploadedFile)[13]
                  ...
              private 'tempFilename' => null
    Après persistance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    object(Doctrine\Common\Collections\ArrayCollection)[301]
      private '_elements' => 
        array (size=1)
          0 => 
            object(NS\HomeBundle\Entity\Image)[1051]
              private 'videoGame' => null
              private 'id' => null
              private 'name' => string 'burnoutparadise.jpg' (length=19)
              private 'extension' => string 'jpeg' (length=4)
              private 'file' => 
                object(Symfony\Component\HttpFoundation\File\UploadedFile)[13]
                  ...
              private 'tempFilename' => null
    Pour résumer:
    Mon objet Image imbriqué dans l'objet Videogame ne récupère pas l'entité Videogame dans son attribut $videoGame du coup j'ai une erreur sql lors de la persistance...

    En me concentrant sur l'essentiel,
    côté VideoGame.php j'ai:
    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
        use Doctrine\Common\Collections\ArrayCollection;
     
        ...
     
        /**
         * @ORM\OneToMany(targetEntity="NS\HomeBundle\Entity\Image", mappedBy="videoGame", cascade={"persist", "remove"})
         * @ORM\JoinColumn(nullable=false)
         */
         private $images;
     
        ...
     
        public function __construct()
        {
            $this->images = new ArrayCollection();
        }
     
        public function addImage(Image $image)
        {
                                    // en faisant ceci VideoGame connait Image
            $this->images[] = $image;
                                    // et en faisant ceci Image connait VideoGame
            $image->setVideoGame($this);
     
            return $this;
        }
    et côté Image.php j'ai:
    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
        /**
         * @ORM\ManyToOne(targetEntity="NS\TestsBundle\Entity\VideoGame", inversedBy="images", cascade={"persist"})
         * @ORM\JoinColumn(nullable=false)
         */
        private $videoGame;
     
        ...
     
        /**
         * Set videoGame
         *
         * @param VideoGame $videoGame
         * @return Image
         */
        public function setVideoGame(VideoGame $videoGame)
        {
            $this->videoGame = $videoGame;
     
            return $this;
        }
    Donc normalement les deux entités se connaissent. J'ai même changer l'ordre d'appel des fonctions en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        public function addImage(Image $image)
        {
            $image->setVideoGame($this);    // ligne échangée avec...
            $this->images[] = $image;               // ... cette ligne
     
            return $this;
        }
    Mais rien ça ne change rien.. :/

    J'ai récemment découvert que la méthode VideoGame::addImage(Image $image) n'est pas appelée lors du persist(). Je pense que c'est pour ça que l'entité Image ne récupère pas l'entité Videogame dans private $videoGame. Mais je ne vois pas pourquoi...
    Merci d'avance pour votre aide et votre temps.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2013
    Messages : 13
    Par défaut
    Bon... Je viens de faire un ManyToMany à la place d'un OneToMany et ça fonctionne... Donc tant pis pour la rigueur car j'avoue être bien lassé de cette erreur.
    Du coup je ne marque pas ce sujet comme résolu pour le moment.

  3. #3
    Membre Expert 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 : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Hello, montre nous ton formType : je dirais qu'il manque un 'by_reference' => false.

Discussions similaires

  1. Servlet non appelée lors du déploiement de l'application web
    Par rebelle49 dans le forum Servlets/JSP
    Réponses: 11
    Dernier message: 18/07/2014, 14h38
  2. Réponses: 0
    Dernier message: 28/05/2009, 18h15
  3. Réponses: 2
    Dernier message: 29/04/2009, 18h58
  4. Réponses: 7
    Dernier message: 21/01/2007, 12h12
  5. Erreur : Non implémenté lors de l'appel d'un evenement
    Par pedouille dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 10/12/2005, 10h15

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