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:
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:
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:
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:
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:
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:
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:
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.