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; }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
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; } }
Jusque là tout va bien :
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();
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 $plane->addPassenger($passenger1); $plane->removePassenger($passenger2);
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 <?php $em->persist($plane); $em->flush();
Quelqu'un saurait m'indiquer où est le problème
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();?
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.
Partager