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 :

Doublons dans une relation oneToMany


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut Doublons dans une relation oneToMany
    Bonjour à tous,

    J'ai un petit problème avec la persistance de mes entités.

    J'ai des 'sousMenu' qui ont une relation OneToMany vers des 'lienSousMenu'. Je peux ajouter dynamiquement des 'lienSousMenu' mais le problème c'est que ceux qui sont rajoutés dynamiquement, sont dupliqués à chaque fois que je soumets mon formulaire.

    Un peu de code pour éclaircir la situation :

    sous menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /**
         * @ORM\OneToMany(targetEntity="LienSousMenu", mappedBy="sousMenu", cascade={"persist"}) 
         */
        private $lienSousMenu;
    lien sous menu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        /**
         * @ORM\ManyToOne(targetEntity="Neo10\CMSBundle\Entity\SousMenu", inversedBy="lienSousMenu")
         */
        protected $sousMenu;
    sous menu handler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public function onSuccess(SousMenu $sousMenu)
        {
            $this->em->persist($sousMenu);
            $this->em->flush();
        }
    sous menu type
    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
     
    public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
    			->add('titre')	
    			->add('file', 'file',array('required'=>false))
    			->add('position','choice',array( 'choices' => array(
    										'0' => 'gauche',
    										'1' => 'centre',
    										'2' => 'droite',			
    			)))
    			->add('lienSousMenu','collection', array('type' => new lienSousMenuType(),
    												'allow_add' => true,
    												'by_reference' => false));
    }
    Voilà je ne sais pas si ça vous suffit, sinon n'hésitez pas ! Ça peut être important à savoir (ou pas), il y a aussi une relation 'oneToMany' entre une entité menu et 'sousMenu' (et encore une entre menusConfigurateur et menu ...).

    Donc en gros par défaut quand l'utilisateur se connecte une première fois j'instancie un menusConfigurateur lié à 4 Menus
    qui sont eux mêmes liés à 3 sousMenus chacun
    qui sont eux mêmes liés à un lienSousMenu.

    Mais lorsque je souhaite rajouter dynamiquement des lienSousMenu ceux ci sont bien crées mais sont dupliqués à chaque fois que je submit mon formulaire.

    A noter que dans la base de données lienSousMenu contient un champ id_sousMenu qui vaut null pour les lienSousMenu ajoutés dynamiquement, alors que pour les premiers cités ils sont correctement renseignés.

    Voilà je compte sur vous pour me donner des pistes! Merci à ceux qui prendront du temps à essayer de résoudre ce problème !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    petit up ! Si vous voulez voir plus de code n'hésitez surtout pas à demander !

  3. #3
    Membre éprouvé
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 141
    Par défaut
    Je ne pourrais te donner que des pistes étant donné que je me sers du prototype pour ajouter dynamiquement des champs de collection. D'ailleurs comment t'y prends tu dans ton template?

    Tu pourrais commencer par ajouter une contrainte NotNull sur l'id_sousMenu déjà, cela bloquerait la chose.

    As-tu essayé de placer un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump($sousMenu); die();
    dans ta fonction onSuccess afin de voir ce que tu obtenais?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Par défaut
    Je déterre un peu ce sujet, mais je n'ai toujours pas résolu mon problème.

    Comme le demandait KzrData, je me sers également des prototypes pour ajouter mes formulaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <div class = "lienSousMenuS" data-prototype="{{ form_widget(sousMenu.lienSousMenu.vars.prototype)|e }}">
    J'ai remarqué quelque chose, c'est que je ne rentrais pas dans la fonction onSucces de mon menusConfigurateurHandler. Je pense que c'est à cause des cascade = 'persist', du coup je les ai supprimés (je pense que c'est à cause de ça que j'ai des doublons).

    Du coup j'ai une erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    A new entity was found through the relationship 'Neo10\CMSBundle\Entity\SousMenu#lienSousMenu' that was not configured to cascade persist operations for entity: Neo10\CMSBundle\Entity\LienSousMenu@00000000036a0629000000009f8746d4. Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement 'Neo10\CMSBundle\Entity\LienSousMenu#__toString()' to get a clue.
    Ce que j'en comprends c'est qu'il faut que je m'assure que mes entités soient bien persistées. Pourtant j'ai l'impression que c'est le cas :

    MenusConfigurateurHandler
    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
     
    public function onSuccess(MenusConfigurateur $menusConfigurateur)
        {
    		foreach($menusConfigurateur->getMenu() as $menu)
    		{	
    				foreach($menu->getSousMenu() as $sousMenu)
    				{
    					foreach($sousMenu->getLienSousMenu() as $lienSousMenu)
    					{	
    						$this->em->persist($lienSousMenu);
     
    						$lienSousMenu->setSousMenu($sousMenu);
    					}
    					$this->em->persist($sousMenu);
    					$menu->setSousMenu($sousMenu);
    				}
    			$this->em->persist($menu);
    			$menu->setMenusConfigurateur($menusConfigurateur);
    		}
            $this->em->persist($menusConfigurateur);
            $this->em->flush();
        }
    J'ai fait la même chose pour Menu, SousMenu et LienSousMenu avec un niveau d'indentation en moins à chaque fois.

    Voilà pour mon problème, j’espère vraiment que quelqu'un va m'aider à en sortir parce que je commence un peu à être à court d'idées

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/09/2008, 10h33
  2. Réponses: 5
    Dernier message: 21/11/2005, 14h24
  3. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27
  4. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37
  5. [access]doublons dans une table en access !
    Par hackerandco dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/06/2004, 14h45

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