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

Doctrine2 PHP Discussion :

Relation OneToMany bidirectionnelle : pas de persistance côté One


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Relation OneToMany bidirectionnelle : pas de persistance côté One
    Bonjour à tous !

    J'ai actuellement une entité Plane et une entité Passenger. Les deux sont liées par une relation OneToMany / ManyToOne. Plane peut donc être associé à plusieurs Passenger et un Passenger peut être associé à seulement un Plane :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
     
    class Plane
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\OneToMany(targetEntity="Passenger", mappedBy="plane", cascade={"persist", "remove"})
         */
        private $passengers;
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Add a passenger to the plane
         *
         * @param Passenger $passenger
         */
        public function addPassenger(Passenger $passenger)
        {
            if (!$this->getPassengers()->contains($passenger)) {
                $this->getPassengers()->add($passenger);
            }
        }
     
        /**
         * Remove a passenger from the plane
         *
         * @param Passenger $passenger
         */
        public function removePassenger(Passenger $passenger)
        {
            if ($this->getPassengers()->contains($passenger)) {
                $this->getPassengers()->removeElement($passenger);
            }
        }
     
        /**
         * Get passengers
         *
         * @return Collection 
         */
        public function getPassengers()
        {
            return $this->passengers;
        }
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    <?php
     
    class Passenger
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\ManyToOne(targetEntity="Plane", inversedBy="passengers")
         * @ORM\JoinColumn(name="plane_id", referencedColumnName="id")
         */
        private $plane;
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set plane
         *
         * @param Plane $plane
         */
        public function setPlane($plane)
        {
            $this->plane = $plane;
        }
     
        /**
         * Get plane
         *
         * @return Plane 
         */
        public function getPlane()
        {
            return $this->plane;
        }
    }
    J'aimerais pouvoir ajouter ou supprimer des Passenger à un Plane depuis celui-ci et sauvegarder en BDD, hors je bloque sur ce dernier point. Voici le code que j'utilise :

    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
    <?php
     
    $em = $this->getDoctrine()->getEntityManager();
     
    $plane = $em->getRepository('Entity\Plane')->find($id);
     
    if (!$plane) {
        throw $this->createNotFoundException('Unable to find Plane entity.');
    }
     
    $passenger1 = $em->getRepository('Entity\Passenger')->find(1);
    $passenger2 = $em->getRepository('Entity\Passenger')->find(2);
     
    $plane->addPassenger($passenger1);
    $plane->removePassenger($passenger2);
     
    $em->persist($plane);
    $em->flush();
    Jusque là tout va bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
     
    $plane->addPassenger($passenger1);
    $plane->removePassenger($passenger2);
    Si j'affiche dans ma vue l'objet $plane je vois bien qu'il contient $passenger1 et qu'il ne contient plus $passenger2. En revanche à ce niveau là ça coince :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
     
    $em->persist($plane);
    $em->flush();
    En BDD l'écriture ne se fait pas pour les Passenger (i.e. plane_id reste null). J'ai bien essayé l'option cascade (visible dans l'entité Plane), sans succès. L'écriture dans l'autre sens se fait bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <?php
     
    $passenger1->setPlane($plane);
    $em->persist($passenger1);
    $em->flush();
    Quelqu'un saurait m'indiquer où est le problème ?

    Edit : problème résolu, tout est expliqué ici : http://www.doctrine-project.org/docs...ociations.html
    you as the developer are responsible to keep the collections on the owning and inverse side up in sync, when you apply changes to them.
    Dernière modification par Invité ; 31/08/2011 à 16h01.

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

Discussions similaires

  1. [2.x] Relation OneToMany : addImage() non appelé lors du persist()
    Par Leenzur dans le forum Symfony
    Réponses: 2
    Dernier message: 17/12/2014, 09h34
  2. Problème : Relation OneToMany/ManyToOne bidirectionnelle
    Par KrisWall dans le forum Doctrine2
    Réponses: 1
    Dernier message: 09/09/2012, 08h46
  3. Relation OneToMany qui marche pas
    Par samaury dans le forum JPA
    Réponses: 1
    Dernier message: 01/01/2010, 19h55
  4. Réponses: 2
    Dernier message: 29/04/2009, 18h58
  5. Réponses: 7
    Dernier message: 21/01/2007, 12h12

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