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:
Localisé dans le l'action createAction de mon controlleur VideoGameController :
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
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
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(), ); }
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 'burnout' (length=7) private 'extension' => null private 'file' => object(Symfony\Component\HttpFoundation\File\UploadedFile)[13] ... private 'tempFilename' => null
Pour résumer:
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
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:
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
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; }
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
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; }
Mais rien ça ne change rien.. :/
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; }
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.
Partager