IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

Relation ManyToMany bidirectionnelle et autoreflexive


Sujet :

Doctrine2 PHP

  1. #1
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut Relation ManyToMany bidirectionnelle et autoreflexive
    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.

    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;
    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
    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 :
    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
    						));
    Ensuite, je mets ces infos dans deux champs du formulaire traite les données renvoyées dans le controller.

    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....
    Douter de tout, toujours, et surtout de soi-même...

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur PHP5/Symfony2
    Inscrit en
    Août 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PHP5/Symfony2

    Informations forums :
    Inscription : Août 2012
    Messages : 89
    Points : 96
    Points
    96
    Par défaut
    peut tu préciser l'erreur affichée par symfony?

  3. #3
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut blackSf,

    En fait je n'ai pas d'erreur qui s'affiche. Les données sont enregistrées dans ma table principale Indiv. Mais aucune info n'est présente dans la table de liaison.

    Doit y avoir un problème dans la gestion des tables en BDD, mais je ne vois pas où.
    Douter de tout, toujours, et surtout de soi-même...

  4. #4
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    en fait maintenant, j'ai l'erreur suivante :

    Catchable Fatal Error: Object of class Rom\BaseBundle\Entity\Indiv could not be converted to string in C:\wamp\www\romSymf\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 103
    Douter de tout, toujours, et surtout de soi-même...

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur PHP5/Symfony2
    Inscrit en
    Août 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PHP5/Symfony2

    Informations forums :
    Inscription : Août 2012
    Messages : 89
    Points : 96
    Points
    96
    Par défaut
    je pense que lorsque tu fais puis tu persiste $i , ça génère un problème

  6. #6
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    effectivement j'ai l'erreur cité juste au dessus.
    Douter de tout, toujours, et surtout de soi-même...

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur PHP5/Symfony2
    Inscrit en
    Août 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PHP5/Symfony2

    Informations forums :
    Inscription : Août 2012
    Messages : 89
    Points : 96
    Points
    96
    Par défaut
    le problème est il résolu ?

  8. #8
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Bonjour,

    Après divers changement, j'ai bien un persistement de mes infos principales, mais pas d'intégration dans la table de liaison et cela sans raison.

    Je pense que cela doit se situer entre addParents() et le persist() mais je ne comprends pas pourquoi.
    Douter de tout, toujours, et surtout de soi-même...

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur PHP5/Symfony2
    Inscrit en
    Août 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur PHP5/Symfony2

    Informations forums :
    Inscription : Août 2012
    Messages : 89
    Points : 96
    Points
    96
    Par défaut
    Bonjour,

    essaye de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $parent->set($i)
    $em->persist($parent);
    $em->persist($i);
    $em->flush();

  10. #10
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut,

    Je vais sans doute dire une connerie, mais on ne peut pas faire de :

    On ne peut persister qu'une instance d'une "classe Entité", pas un de ses attributs ?? Non ?

    Je viens de modifier le code du controller en faisant cela :
    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
     
    $request = $this->getRequest();
        if ($request->isMethod('POST')) {
    	$formulaire = $form->bindRequest($request);
    	$i = $form->getData();
     
    	$idPere=$i->getPere()->getId();
    	$idMere=$i->getMere()->getId();
     
    	$i->setPere($i->getPere()->getId());
    	$i->setMere($i->getMere()->getId());
     
    	$pere = $this->getDoctrine()->getManager()->getRepository('BaseBundle:Indiv')->cherchePers($idPere);
    	$mere = $this->getDoctrine()->getManager()->getRepository('BaseBundle:Indiv')->cherchePers($idMere);
     
    	$i->addParent($mere) ;
    	$i->addParent($mere) ;
    	$x= $i->getParents();
    		var_dump($x);
     
    	$em->persist($i);
    	$em->flush();
    Lors de la soumission du formulaire, j'ai bien un objet $i qui reprend les informations sur l'individu.
    Le var_dump() m'indique clairement que l'attribut $parents contient deux objets individus avec leurs ID

    Le "flush()" lui ne soulève pas de problème puisque je n'ai pas d'erreur en retour. Mais rien ne s'inscrit dans la table de liaison.

    Je commence doucement à craquer
    Douter de tout, toujours, et surtout de soi-même...

  11. #11
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Je continue.....

    Puisqu'il n'y a pas d'inscription en base de données, je me suis dit que le problème se trouvait dans la déclaration de ma relation ManyToMany.

    Et puis je ne sais pas pourquoi, j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $i->addParent($mere) ;
    $i->addParent($mere) ;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $i->addEnfant($mere) ;
    $i->addEnfant($mere) ;
    et là cela fonctionne.

    Du coup, je suis sûr que ma construction de mes attributs est foireuse. Mais où? Comme il s'agit d'une relation Bi-directionnelle et self-referencing, on devrait pouvoir persister les données en prenant les choses par les deux bouts non?

    Je ne comprends absolument pas ou j'ai merdouillé.

    Voici au final ma relation dans l'entité indiv.
    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
      /**
         * @ORM\ManyToMany(targetEntity="Indiv", mappedBy="enfants", cascade={"persist"})
         * @ORM\JoinTable(name="enfants",
         * 		joinColumns={@ORM\JoinColumn(name="parent_id", referencedColumnName="id")},
         *      inverseJoinColumns={@ORM\JoinColumn(name="enfant_id", referencedColumnName="id")})
         **/
        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;
    Douter de tout, toujours, et surtout de soi-même...

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Points : 183
    Points
    183
    Par défaut var_dump($form->getData())
    salut
    Peux-tu nous dire ce que donne var_dump($form->getData()) ?

  13. #13
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut,

    alors, avant le traitement "objet" des parents, le var_dump(form->getData()) donne cela

    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    object(Rom\BaseBundle\Entity\Indiv)[231]
      private 'id' => null
      private 'nom' => string 'encore' (length=6)
      private 'prenom' => string 'UnEssai' (length=7)
      private 'dateNaiss' => 
        object(DateTime)[1244]
          public 'date' => string '2013-04-04 00:00:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Paris' (length=12)
      private 'region' => null
      private 'nomVille' => null
      private 'date_Arr' => null
      private 'nb_sejour' => null
      private 'raison_dpar' => int 1
      private 'sexe' => string 'F' (length=1)
      private 'grossesse' => boolean false
      private 'num_car' => null
      private 'parents_frce' => boolean false
      private 'parents_adrs' => null
      private 'parents_numcar' => null
      private 'parents_datar' => null
      private 'parents_legaux' => boolean false
      private 'comm' => null
      private 'scolarise' => boolean false
      private 'au_pays' => boolean false
      private 'confies' => boolean false
      private 'aqui' => null
      private 'pere' => 
        object(Rom\BaseBundle\Entity\Indiv)[1299]
          private 'id' => int 30
          private 'nom' => string 'pere2' (length=5)
          private 'prenom' => string 'sdf' (length=3)
          private 'dateNaiss' => 
            object(DateTime)[1291]
              public 'date' => string '2000-02-12 00:00:00' (length=19)
              public 'timezone_type' => int 3
              public 'timezone' => string 'UTC' (length=3)
          private 'region' => string 'dd' (length=2)
          private 'nomVille' => string 'dd' (length=2)
          private 'date_Arr' => null
          private 'nb_sejour' => null
          private 'raison_dpar' => string '2' (length=1)
          private 'sexe' => string 'M' (length=1)
          private 'grossesse' => boolean false
          private 'num_car' => null
          private 'parents_frce' => boolean false
          private 'parents_adrs' => null
          private 'parents_numcar' => null
          private 'parents_datar' => null
          private 'parents_legaux' => boolean false
          private 'comm' => null
          private 'scolarise' => boolean false
          private 'au_pays' => boolean false
          private 'confies' => boolean false
          private 'aqui' => null
          private 'pere' => null
          private 'mere' => null
          private 'medical' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Medical)[1334]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1335]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Medical) => null
              private 'vu_medecin' (Rom\BaseBundle\Entity\Medical) => null
              private 'ete_urgence' (Rom\BaseBundle\Entity\Medical) => null
              private 'ete_hopital' (Rom\BaseBundle\Entity\Medical) => null
              private 'prise_medoc' (Rom\BaseBundle\Entity\Medical) => null
              private 'bon_etat_medic' (Rom\BaseBundle\Entity\Medical) => null
              private 'desc_medic' (Rom\BaseBundle\Entity\Medical) => null
              private 'couv_med' (Rom\BaseBundle\Entity\Medical) => null
              private 'desc_couv_med' (Rom\BaseBundle\Entity\Medical) => null
              private 'indiv' (Rom\BaseBundle\Entity\Medical) => null
          private 'logtPays' => null
          private 'ressource' => null
          private 'activites' => 
            object(Doctrine\ORM\PersistentCollection)[1323]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1299]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'indiv' (length=5)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[1333]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1338]
                  ...
          private 'statut' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Statut)[1341]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1342]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Statut) => null
              private 'statut_sejour' (Rom\BaseBundle\Entity\Statut) => null
          private 'nationalite' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Pays)[1343]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1344]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Pays) => null
              private 'nom' (Rom\BaseBundle\Entity\Pays) => null
          private 'parcours' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Parcours)[1345]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1346]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Parcours) => null
              private 'parcours' (Rom\BaseBundle\Entity\Parcours) => null
          private 'conjoint' => null
          private 'parents' => 
            object(Doctrine\ORM\PersistentCollection)[1340]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1299]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'enfants' (length=7)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[237]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1339]
                  ...
          private 'enfants' => 
            object(Doctrine\ORM\PersistentCollection)[1347]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1299]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'parents' (length=7)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[237]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1348]
                  ...
      private 'mere' => 
        object(Rom\BaseBundle\Entity\Indiv)[1351]
          private 'id' => int 32
          private 'nom' => string 'mere2' (length=5)
          private 'prenom' => string 'ee' (length=2)
          private 'dateNaiss' => 
            object(DateTime)[1350]
              public 'date' => string '2000-02-12 00:00:00' (length=19)
              public 'timezone_type' => int 3
              public 'timezone' => string 'UTC' (length=3)
          private 'region' => null
          private 'nomVille' => null
          private 'date_Arr' => null
          private 'nb_sejour' => int 5
          private 'raison_dpar' => string '3' (length=1)
          private 'sexe' => string 'F' (length=1)
          private 'grossesse' => boolean false
          private 'num_car' => null
          private 'parents_frce' => boolean false
          private 'parents_adrs' => null
          private 'parents_numcar' => null
          private 'parents_datar' => null
          private 'parents_legaux' => boolean false
          private 'comm' => null
          private 'scolarise' => boolean false
          private 'au_pays' => boolean false
          private 'confies' => boolean false
          private 'aqui' => null
          private 'pere' => null
          private 'mere' => null
          private 'medical' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Medical)[1352]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1335]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Medical) => null
              private 'vu_medecin' (Rom\BaseBundle\Entity\Medical) => null
              private 'ete_urgence' (Rom\BaseBundle\Entity\Medical) => null
              private 'ete_hopital' (Rom\BaseBundle\Entity\Medical) => null
              private 'prise_medoc' (Rom\BaseBundle\Entity\Medical) => null
              private 'bon_etat_medic' (Rom\BaseBundle\Entity\Medical) => null
              private 'desc_medic' (Rom\BaseBundle\Entity\Medical) => null
              private 'couv_med' (Rom\BaseBundle\Entity\Medical) => null
              private 'desc_couv_med' (Rom\BaseBundle\Entity\Medical) => null
              private 'indiv' (Rom\BaseBundle\Entity\Medical) => null
          private 'logtPays' => null
          private 'ressource' => null
          private 'activites' => 
            object(Doctrine\ORM\PersistentCollection)[1353]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1351]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'indiv' (length=5)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[1333]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1354]
                  ...
          private 'statut' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Statut)[1355]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1342]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Statut) => null
              private 'statut_sejour' (Rom\BaseBundle\Entity\Statut) => null
          private 'nationalite' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Pays)[1356]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1344]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Pays) => null
              private 'nom' (Rom\BaseBundle\Entity\Pays) => null
          private 'parcours' => 
            object(Proxies\__CG__\Rom\BaseBundle\Entity\Parcours)[1357]
              private '_entityPersister' => 
                object(Doctrine\ORM\Persisters\BasicEntityPersister)[1346]
                  ...
              private '_identifier' => 
                array
                  ...
              public '__isInitialized__' => boolean false
              private 'id' (Rom\BaseBundle\Entity\Parcours) => null
              private 'parcours' (Rom\BaseBundle\Entity\Parcours) => null
          private 'conjoint' => null
          private 'parents' => 
            object(Doctrine\ORM\PersistentCollection)[1358]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1351]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'enfants' (length=7)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[237]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1359]
                  ...
          private 'enfants' => 
            object(Doctrine\ORM\PersistentCollection)[1360]
              private 'snapshot' => 
                array
                  ...
              private 'owner' => 
                &object(Rom\BaseBundle\Entity\Indiv)[1351]
              private 'association' => 
                array
                  ...
              private 'em' => 
                object(Doctrine\ORM\EntityManager)[219]
                  ...
              private 'backRefFieldName' => string 'parents' (length=7)
              private 'typeClass' => 
                object(Doctrine\ORM\Mapping\ClassMetadata)[237]
                  ...
              private 'isDirty' => boolean false
              private 'initialized' => boolean false
              private 'coll' => 
                object(Doctrine\Common\Collections\ArrayCollection)[1361]
                  ...
      private 'medical' => 
        object(Rom\BaseBundle\Entity\Medical)[1268]
          private 'id' => null
          private 'vu_medecin' => boolean false
          private 'ete_urgence' => boolean false
          private 'ete_hopital' => boolean false
          private 'prise_medoc' => boolean false
          private 'bon_etat_medic' => boolean false
          private 'desc_medic' => null
          private 'couv_med' => boolean false
          private 'desc_couv_med' => null
          private 'indiv' => null
      private 'logtPays' => null
      private 'ressource' => null
      private 'activites' => 
        object(Doctrine\Common\Collections\ArrayCollection)[232]
          private '_elements' => 
            array
              empty
      private 'statut' => 
        object(Rom\BaseBundle\Entity\Statut)[1377]
          private 'id' => int 3
          private 'statut_sejour' => string 'Mineur' (length=6)
      private 'nationalite' => 
        object(Rom\BaseBundle\Entity\Pays)[1263]
          private 'id' => int 3
          private 'nom' => string 'Andorre' (length=7)
      private 'parcours' => 
        object(Rom\BaseBundle\Entity\Parcours)[1288]
          private 'id' => int 4
          private 'parcours' => string 'Hôtel autres dpt' (length=17)
      private 'conjoint' => null
      private 'parents' => 
        object(Doctrine\Common\Collections\ArrayCollection)[233]
          private '_elements' => 
            array
              empty
      private 'enfants' => 
        object(Doctrine\Common\Collections\ArrayCollection)[234]
          private '_elements' => 
            array
              empty

    Une fois le traitement fait, Mon "objet" individus 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    object(Rom\BaseBundle\Entity\Indiv)[231]
      private 'id' => null
      private 'nom' => string 'encore' (length=6)
      private 'prenom' => string 'UnEssai' (length=7)
      private 'dateNaiss' => 
        object(DateTime)[1244]
          public 'date' => string '2013-04-04 00:00:00' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Paris' (length=12)
      private 'region' => null
      private 'nomVille' => null
      private 'date_Arr' => null
      private 'nb_sejour' => null
      private 'raison_dpar' => int 1
      private 'sexe' => string 'F' (length=1)
      private 'grossesse' => boolean false
      private 'num_car' => null
      private 'parents_frce' => boolean false
      private 'parents_adrs' => null
      private 'parents_numcar' => null
      private 'parents_datar' => null
      private 'parents_legaux' => boolean false
      private 'comm' => null
      private 'scolarise' => boolean false
      private 'au_pays' => boolean false
      private 'confies' => boolean false
      private 'aqui' => null
      private 'pere' => int 30
      private 'mere' => int 32
      private 'medical' => 
        object(Rom\BaseBundle\Entity\Medical)[1268]
          private 'id' => null
          private 'vu_medecin' => boolean false
          private 'ete_urgence' => boolean false
          private 'ete_hopital' => boolean false
          private 'prise_medoc' => boolean false
          private 'bon_etat_medic' => boolean false
          private 'desc_medic' => null
          private 'couv_med' => boolean false
          private 'desc_couv_med' => null
          private 'indiv' => null
      private 'logtPays' => null
      private 'ressource' => null
      private 'activites' => 
        object(Doctrine\Common\Collections\ArrayCollection)[232]
          private '_elements' => 
            array
              empty
      private 'statut' => 
        object(Rom\BaseBundle\Entity\Statut)[1377]
          private 'id' => int 3
          private 'statut_sejour' => string 'Mineur' (length=6)
      private 'nationalite' => 
        object(Rom\BaseBundle\Entity\Pays)[1263]
          private 'id' => int 3
          private 'nom' => string 'Andorre' (length=7)
      private 'parcours' => 
        object(Rom\BaseBundle\Entity\Parcours)[1288]
          private 'id' => int 4
          private 'parcours' => string 'Hôtel autres dpt' (length=17)
      private 'conjoint' => null
      private 'parents' => 
        object(Doctrine\Common\Collections\ArrayCollection)[233]
          private '_elements' => 
            array
              empty
      private 'enfants' => 
        object(Doctrine\Common\Collections\ArrayCollection)[234]
          private '_elements' => 
            array
              0 => 
                object(Rom\BaseBundle\Entity\Indiv)[1351]
                  ...
              1 => 
                object(Rom\BaseBundle\Entity\Indiv)[1299]
                  ...
    Le private pere et le private mere sont maintenant renseignés. Par Contre, le $Parents lui est toujours vide, ce qui est logique puisque je me sers de pere et mere pour remplir le $Parents .



    Et le retour de var_dump(getParents()) 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
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    object(Doctrine\Common\Collections\ArrayCollection)[233]
      private '_elements' => 
        array
          0 => 
            object(Rom\BaseBundle\Entity\Indiv)[1351]
              private 'id' => int 32
              private 'nom' => string 'mere2' (length=5)
              private 'prenom' => string 'ee' (length=2)
              private 'dateNaiss' => 
                object(DateTime)[1350]
                  ...
              private 'region' => null
              private 'nomVille' => null
              private 'date_Arr' => null
              private 'nb_sejour' => int 5
              private 'raison_dpar' => string '3' (length=1)
              private 'sexe' => string 'F' (length=1)
              private 'grossesse' => boolean false
              private 'num_car' => null
              private 'parents_frce' => boolean false
              private 'parents_adrs' => null
              private 'parents_numcar' => null
              private 'parents_datar' => null
              private 'parents_legaux' => boolean false
              private 'comm' => null
              private 'scolarise' => boolean false
              private 'au_pays' => boolean false
              private 'confies' => boolean false
              private 'aqui' => null
              private 'pere' => null
              private 'mere' => null
              private 'medical' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Medical)[1352]
                  ...
              private 'logtPays' => null
              private 'ressource' => null
              private 'activites' => 
                object(Doctrine\ORM\PersistentCollection)[1353]
                  ...
              private 'statut' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Statut)[1355]
                  ...
              private 'nationalite' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Pays)[1356]
                  ...
              private 'parcours' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Parcours)[1357]
                  ...
              private 'conjoint' => null
              private 'parents' => 
                object(Doctrine\ORM\PersistentCollection)[1358]
                  ...
              private 'enfants' => 
                object(Doctrine\ORM\PersistentCollection)[1360]
                  ...
          1 => 
            object(Rom\BaseBundle\Entity\Indiv)[1299]
              private 'id' => int 30
              private 'nom' => string 'pere2' (length=5)
              private 'prenom' => string 'sdf' (length=3)
              private 'dateNaiss' => 
                object(DateTime)[1291]
                  ...
              private 'region' => string 'dd' (length=2)
              private 'nomVille' => string 'dd' (length=2)
              private 'date_Arr' => null
              private 'nb_sejour' => null
              private 'raison_dpar' => string '2' (length=1)
              private 'sexe' => string 'M' (length=1)
              private 'grossesse' => boolean false
              private 'num_car' => null
              private 'parents_frce' => boolean false
              private 'parents_adrs' => null
              private 'parents_numcar' => null
              private 'parents_datar' => null
              private 'parents_legaux' => boolean false
              private 'comm' => null
              private 'scolarise' => boolean false
              private 'au_pays' => boolean false
              private 'confies' => boolean false
              private 'aqui' => null
              private 'pere' => null
              private 'mere' => null
              private 'medical' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Medical)[1334]
                  ...
              private 'logtPays' => null
              private 'ressource' => null
              private 'activites' => 
                object(Doctrine\ORM\PersistentCollection)[1323]
                  ...
              private 'statut' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Statut)[1341]
                  ...
              private 'nationalite' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Pays)[1343]
                  ...
              private 'parcours' => 
                object(Proxies\__CG__\Rom\BaseBundle\Entity\Parcours)[1345]
                  ...
              private 'conjoint' => null
              private 'parents' => 
                object(Doctrine\ORM\PersistentCollection)[1340]
                  ...
              private 'enfants' => 
                object(Doctrine\ORM\PersistentCollection)[1347]
                  ...
    J'ai donne bien dans l'atribut $Parents, un array avec deux objets individus correspondant aux parents
    Douter de tout, toujours, et surtout de soi-même...

  14. #14
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    je n'ai pas regardé le code et la conversation en détail mais:
    Comme il s'agit d'une relation Bi-directionnelle et self-referencing, on devrait pouvoir persister les données en prenant les choses par les deux bouts non?
    Cela est faux, il y a une notion de owning et inverse side dans les relations bidirectionnels qui fait que Doctrine ne se base que sur un des cotés de la relation (le owning side) pour effectuer les requetes sql.
    je te laisse suivre les liens:
    http://www.developpez.net/forums/d13...s/#post7201920

  15. #15
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut arnooo999,

    merci de ta réponse, cela me soulage. Je viens de lire les posts et la doc sur le sujet. Je comprends parfaitement la logique dans le cadre d'une relation MtM entre deux entités. L'une des deux est considérée par Doctrine comme propriétaire et l'autre pas, même dans le cas d'une bi-directionnelle.

    Néanmoins, dans mon cas, la relation concerne la même entité. La relation est rélexive. Du coup, je ne pige pas comment on peut considérer qu'une entité peut être à la fois propriétaire et inverse.

    Par ailleurs, les attributs $Parents et $Enfants appartiennent à la même entités. J'ai donc des getters et des setters similaires :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    /**
     * Rom\BaseBundle\Entity\Indiv
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Rom\BaseBundle\Entity\IndivRepository")
     */
    class Indiv
    {
      /**
         * @ORM\ManyToMany(targetEntity="Indiv", mappedBy="enfants", cascade={"persist"})
         * @ORM\JoinTable(name="enfants",
         * 		joinColumns={@ORM\JoinColumn(name="parent_id", referencedColumnName="id")},
         *      inverseJoinColumns={@ORM\JoinColumn(name="enfant_id", referencedColumnName="id")})
         **/
        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;
     
      public function __construct()
        {
        	$this->activites = new ArrayCollection();
        	$this->parents = new ArrayCollection();
        	$this->enfants = new ArrayCollection();
        }
     
        public function addEnfant(\Rom\BaseBundle\Entity\Indiv $enfants)
        {
            $this->enfants[] = $enfants;
     
            return $this;
        }
     
        /**
         * Remove enfants
         *
         * @param \Rom\BaseBundle\Entity\Indiv $enfants
         */
        public function removeEnfant(\Rom\BaseBundle\Entity\Indiv $enfants)
        {
            $this->enfants->removeElement($enfants);
        }
     
        /**
         * Get enfants
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getEnfants()
        {
            return $this->enfants;
        }
     
        /**
         * Add parents
         *
         * @param \Rom\BaseBundle\Entity\Indiv $parents
         * @return Indiv
         */
        public function addParent(\Rom\BaseBundle\Entity\Indiv $parents)
        {
            $this->parents[] = $parents;
     
            return $this;
        }
     
        /**
         * Remove parents
         *
         * @param \Rom\BaseBundle\Entity\Indiv $parents
         */
        public function removeParent(\Rom\BaseBundle\Entity\Indiv $parents)
        {
            $this->parents->removeElement($parents);
        }
     
        /**
         * Get parents
         *
         * @return \Doctrine\Common\Collections\Collection 
         */
        public function getParents()
        {
            return $this->parents;
        }
    En conclusion je dois rajouter la ligne suivante dans le addEnfants de ma classe?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Indiv->addParents($this);
    En fait cela équivaut à utiliser les enfants d'un individus pour créer les grands-parents ? c'est bizarre
    Douter de tout, toujours, et surtout de soi-même...

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    par rapport à ton mapping:
    Il n'est pas nécessaire de définir deux fois la table de liaison, il suffit de la définir sur la relation propriétaire "enfants".
    A vrai dire,comme tu utilises la convention de Doctrine (clé primaire de nom "id", clé étrangère de nom "enfant_id" et "parent_id"), je ne suis pas sûr que tu sois obligé de préciser les noms de colonnes).

    e ne pige pas comment on peut considérer qu'une entité peut être à la fois propriétaire et inverse
    Il faut considérer que c'est la relation et non l'entité qui est propriétaire.
    c'est donc l'attribut "enfants" qui est propriétaire de la relation et l'attribut "parents" qui est le coté inverse de la relation.

    En conclusion je dois rajouter la ligne suivante dans le addEnfants de ma classe?
    Code :
    $Indiv->addParents($this);
    C'est à peu prés ça, il faut mettre de la logique dans les setters ou "adder" de tes entités, afin que les collections soit cohérentes.
    Mais il faut faire attention aux effets de bords:
    par exemple, ici tu risques d'avoir des doublons dans ta collection parents (pas au niveau de la persistence mais si tu utilises ton entité dans la suite de ton code)
    ou bien : est t'on sur que c'est la méthode addEnfant qui est appelé (il me semble que sur Symfony >= 2.1 , c'est le cas)
    ...

    Sinon je ne sais pas si un ManyToMany est vraiment adapté, as tu considéré l'option d'avoir un attribut "pere" et un attribut "mere"?

  17. #17
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Sinon je ne sais pas si un ManyToMany est vraiment adapté, as tu considéré l'option d'avoir un attribut "pere" et un attribut "mere"?
    EFfectivement tu as raison, j'ai rajouté les atttributs père et mère à ma classe indiv, histoire de me simplifier le problème. N'empêche que je veux(voulais) résoudre ce problème de réflexivité de ma relation de filiation.

    D'un point de vue totalement conceptuelle de base de données, cette relation n,n ou ManyToMany me semble indispensable, puisque toutes données sont des individus. Maintenant d'un point de vue pratique, mettre un attribut père et un attribut mère est plus facile.

    Et puis cela ne règle pas le problème de la individu-individu pour décrire les enfants. Il faudra toujours qu'il y ait un retour. Ou alors créer une table enfants, mais si les enfants ont des enfants, cela casse tout.

    Ces histoires de relations réflexives, çà m'a toujours gonflé. En rien de temps on peut tout faire sauter.
    Douter de tout, toujours, et surtout de soi-même...

Discussions similaires

  1. Relation ManyToMany bidirectionnelle
    Par Mister Nono dans le forum Doctrine2
    Réponses: 6
    Dernier message: 24/04/2014, 23h07
  2. Réponses: 13
    Dernier message: 28/06/2013, 09h23
  3. Réponses: 8
    Dernier message: 27/02/2009, 01h37
  4. Relation ManyToMany bidirectionnelle
    Par remika dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/01/2009, 11h51
  5. [NHibernate.Mapping.Attributes] Relation ManyToMany
    Par anthyme dans le forum NHibernate
    Réponses: 2
    Dernier message: 12/07/2007, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo