bonjour à tous,
je reviens sur mon projet de BDD parce que j'ai un petit problème. Je vous fais un petit résumé. J'ai une entité Indiv (individus), qui recueille des données sur une personne. Une personne peut avoir 0 ou n enfants (qui sont aussi des individus). De même chaque individu peut avoir 0 à deux parents qui sont aussi des individus.
En conclusion j'ai une relation ManyToMany bi-directionnelle et auto réflexive. Voici ma classe Indiv.
Le repository :
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 class Indiv { /** * @var integer $id * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var string $nom * * @ORM\Column(name="nom", type="string", length=25) */ private $nom; /** * @var string $prenom * * @ORM\Column(name="prenom", type="string", length=25) */ private $prenom; /** * @var \DateTime $dateNaiss * * @ORM\Column(name="dateNaiss", type="datetime", nullable=true) */ private $dateNaiss; .../... /** * @ORM\ManyToMany(targetEntity="Indiv", mappedBy="enfants", cascade={"persist"}) **/ private $parents; /** * @ORM\ManyToMany(targetEntity="Indiv", inversedBy="parents", cascade={"persist"}) * @ORM\JoinTable(name="enfants", * joinColumns={@ORM\JoinColumn(name="enfant_id", referencedColumnName="id")}, * inverseJoinColumns={@ORM\JoinColumn(name="parent_id", referencedColumnName="id")} * ) **/ private $enfants;
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 class IndivRepository extends EntityRepository { public function chercheHom(){ // $req = $this->_em->createQuery("SELECT i.nom,i.prenom from BaseBundle:Indiv i where i.sexe = 'M' "); $req = $this->createQueryBuilder('i'); $req->where('i.sexe = :sex')->setParameter('sex', 'M'); $result = $req->getQuery()->getArrayResult(); return $result; } public function chercheFem(){ // $req = $this->_em->createQuery("SELECT i.nom,i.prenom from BaseBundle:Indiv i where i.sexe = 'M' "); $req = $this->createQueryBuilder('i'); $req->where('i.sexe = :sex')->setParameter('sex', 'F'); $result = $req->getQuery()->getResult(); return $result; } public function cherchePers($p){ $rep = $this->getEntityManager()->getRepository('BaseBundle:Indiv'); $result = $rep->find($p); return $result; } }
Dans le formulaire, je voudrais enregistrer, pour un individu, le nom de ses parents. J'ai donc créé deux requêtes qui récupère le nom des Hommes et idem pour les femmes.
Mon controller :
Ensuite, je mets ces infos dans deux champs du formulaire traite les données renvoyées dans le controller.
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 public function indexAction() { $em = $this->getDoctrine()->getManager(); $i = new Indiv(); $a = new Activite();//$b = new ArrayObject($b); $hom = $this->getDoctrine()->getManager()->getRepository('BaseBundle:Indiv')->chercheHom(); $fem = $this->getDoctrine()->getManager()->getRepository('BaseBundle:Indiv')->chercheFem(); $form = $this->createForm(new IndivType(), $i); $request = $this->getRequest(); if ($request->isMethod('POST')) { $formulaire = $form->bindRequest($request); $i = $form->getData(); $id=$i->getPere()->getId(); $i->setPere($i->getPere()->getId()); $donn = $this->getDoctrine()->getManager()->getRepository('BaseBundle:Indiv')->cherchePers($id); $i->addParent($donn) ; $em->persist($i); $em->flush(); return $this->redirect($this->generateUrl('indexll')); } return $this ->render('BaseBundle:Default:index.html.twig', array('form' => $form->createView(), 'Hom' => $hom, 'Fem' => $fem ));
Le IndivType
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 ->add('pere','entity', array('class'=>'BaseBundle:Indiv', 'property'=>'nom', 'query_builder'=>function(IndivRepository $ir){ return $ir->chercheHom();}, 'label'=>'Nom du père : ', 'empty_value'=>'Choisissez...')) ->add('mere','entity', array('class'=>'BaseBundle:Indiv', 'property'=>'nom', 'query_builder'=>function(IndivRepository $ir){ return $ir->chercheFem();}, 'label'=>'Nom du mer : ', 'empty_value'=>'Choisissez...'))
Le problème c'est que je n'arrive pas à faire persister les données dans la propriété parents. et du coup je n'ai pas d'infos dans la table de liaison parents-enfants.
Si vous avez une idée ?
Deuxièmement, comment fait ton pour récupérer deux champs concatenés, genre "prénom nom", avec un espace entre les deux dans le form type.
Voilà ce que j'ai fait, mais cela ne fonctionne pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ->add('pere','entity', array('class'=>'BaseBundle:Indiv', 'property'=>'nom', query_builder'=>function(EntityRepository $er){ return $er->createQueryBuilder('i') ->$this->createQueryBuilder('i')->expr()->concat('i.nom', $this->createQueryBuilder('i')->expr()->concat(' ', 'i.prenom')) ->where('i.sexe = :sex') ->setParameter('sex', 'M') ->orderBy('i.nom', 'ASC');}, 'label'=>'Nom du père : ', 'empty_value'=>'Choisissez...'))
Bonne journée à tous et attention à l'abus de chocolat....
Partager