- Associations Many to Many voir doctrine
- Dans ce nouvel exemple, les entités associées aux tables auteur et livre sont nommées Auteur et Livre.
- La gestion des associations par Doctrine n'est pas symétrique : il y a une Entité qui est
prioritaire et qui peut gérer les informations associatives : c'est l'entité dans laquelle
les directives
@JointTable
sont présentes, ici l'entité Auteur et l'attribut livNumArray :
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\ManyToMany(targetEntity="Livre", inversedBy="aut")
* @ORM\JoinTable(name="livaut",
* joinColumns={
* @ORM\JoinColumn(name="aut_id", referencedColumnName="aut_id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="liv_num", referencedColumnName="liv_num")
* }
* )
*/
private $livNumArray;
- Modification de l'entité prioritaire ici
Auteur::class
avec une méthode permettant l'ajout d'un livre
/**
* @param Livre $livre
*/
public function addLivre(Livre $livre) {
$this->livNumArray->add($livre);
}
- Construction du formulaire v1 (liste de sélection)
$livres = $this->getDoctrine()->getRepository(Livre::class)->findAll();
$dataChoice = array();
foreach ($livres as $livre) {
$livTitre = $livre->getLivTitre();
$dataChoice[$livTitre] = $livre->getLivNum();
}
$form = $this->createFormBuilder()
->add('liv_num', ChoiceType::class, array('choices' => $dataChoice))
->add('save', SubmitType::class, array('label' => 'Update livre'))
->getForm();
- Construction du formulaire v2 (checkbox)
$livres = $this->getDoctrine()->getRepository(Livre::class)->findAll();
$form = $this->createFormBuilder()
->add('liv_num', EntityType::class, [
'class' => Livre::class,
'multiple' => false,
'expanded' => false,
'choice_label' => 'liv_titre',
])
->add('save', SubmitType::class, array('label' => 'Update livre'))
->getForm();
- Traitement des données du formulaire
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$livre = $this->getDoctrine()
->getRepository(Livre::class)
->find($form->getData()['liv_num']);
$auteur->addLivre($livre);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($livre);
$entityManager->persist($auteur);
$entityManager->flush();
return $this->redirectToRoute('detailAuteur', array('id'=> $autId));
}
- Demo