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 :

Persist relation ManyToMany avec attributs


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut Persist relation ManyToMany avec attributs
    Bonjour à tous,

    J'ai un soucis au niveau du persist pour une relation bidirectionnelle avec attributs.
    J'ai une entité Piste qui est une Personne.
    J'ai une relation ManyToMany entre une personne et une fonction, ce qui me donne l'entité PersonneFonction.

    Voici mes entités :
    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
    /**
     * Icme\MainBundle\Entity\Personne
     *
     * @ORM\Table(name="personne")
     * @ORM\Entity(repositoryClass="Icme\MainBundle\Repository\PersonneRepository")
     */
    class Personne
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        /**
         * @var string $nom
         *
         * @ORM\Column(name="nom", type="string", length=50, nullable=false)
         * @Assert\NotBlank(message="Le nom ne peut être vide")
         */
        private $nom;
     
        /**
         * @var string $prenom
         *
         * @ORM\Column(name="prenom", type="string", length=50, nullable=false)
         * @Assert\NotBlank(message="Le prénom ne peut être vide")
         */
        private $prenom;
     
        /**
         * @var string $mail
         *
         * @ORM\Column(name="mail", type="string", length=50, nullable=true)
         * @Assert\NotBlank(message="L'adresse mail ne peut être vide")
         * 
         */
        private $mail;
     
     
        /**
         * @var datetime $datecreation
         *
         * @ORM\Column(name="dateCreation", type="datetime", nullable=false)
         */
        private $datecreation;
     
        /**
         * @var PersonneFonctions
         *
         * @ORM\OneToMany(targetEntity="Icme\MainBundle\Entity\PersonneFonction", mappedBy="personne")
         *
         */
        private $personnefonctions;    
     
     
        public function  __construct()
        {
        	$this->datecreation = new \DateTime('NOW', new \DateTimeZone('Europe/Paris'));
        	$this->personnefonctions = new ArrayCollection();
        }
     
        /**
         * Add personnefonctions
         *
         * @return Icme\MainBundle\Entity\PersonneFonction
         */
        public function addPersonnefonction(\Icme\MainBundle\Entity\PersonneFonction $personnefonctions)
        {
        	$this->personnefonctions[] = $personnefonctions;
        	$personnefonctions->setPersonne($this);
        }
     
        /**
         * Remove personnefonctions
         *
         * @param Icme\MainBundle\Entity\Personnefonction $personnefonction
         */
        public function removePersonnefonction(\Icme\MainBundle\Entity\PersonneFonction $personnefonctions)
        {
        	$this->personnefonctions->removeElement($personnefonctions);
        	$personnefonctions->setPersonne(null);    	 
        }
     
        /**
         * Get personnefonctions
         * @return \Icme\MainBundle\Entity\PersonneFonctions
         */
        public function getPersonnefonctions()
        {
        	return $this->personnefonctions;
        }
     
        public function setPersonnefonctions(array $personnefonctions)
        {
        	$this->personnefonctions = new ArrayCollection($personnefonctions);
      		foreach ($personnefonctions as $personnefonction)
        		$personnefonction->setPersonne($this);
        }
    PersonneFonction :
    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
    /**
     * Icme\MainBundle\Entity\PersonneFonction
     *
     * @ORM\Table(name="personne_fonction")
     * @ORM\Entity
     */
    class PersonneFonction
    {
    	/**
    	 * @var Fonction
    	 * @ORM\Id
    	 * @ORM\ManyToOne(targetEntity="Fonction", inversedBy="personnefonction")
    	 * @ORM\JoinColumns({
    	 *   @ORM\JoinColumn(name="idFonction", referencedColumnName="id")
    	 * })
    	 */
    	private $fonction;
     
    	/**
    	 * @var Personne
    	 * @ORM\Id
    	 * @ORM\ManyToOne(targetEntity="Personne", inversedBy="personnefonction")
    	 * @ORM\JoinColumns({
    	 * 	@ORM\JoinColumn(name="idPersonne", referencedColumnName="id")
    	 * })
    	 */
    	private $personne;
     
        /**
         * @var datetime $dateaffectation
         *
         * @ORM\Column(name="dateAffectation", type="datetime", nullable=false)
         */
        private $dateaffectation;
     
     
        public function  __construct()
        {
        	$this->dateaffectation = new \DateTime('NOW', new \DateTimeZone('Europe/Paris'));
        }
     
        /**
         * Set dateaffectation
         *
         * @param datetime $dateaffectation
         */
        public function setDateaffectation($dateaffectation)
        {
            $this->dateaffectation = $dateaffectation;
        }
     
        /**
         * Get dateaffectation
         *
         * @return datetime 
         */
        public function getDateaffectation()
        {
            return $this->dateaffectation;
        }
     
        /**
         * Set fonction
         *
         * @param Icme\MainBundle\Entity\Fonction $fonction
         */
        public function setFonction(\Icme\MainBundle\Entity\Fonction $fonction)
        {
            $this->fonction = $fonction;
        }
     
        /**
         * Get fonction
         *
         * @return Icme\MainBundle\Entity\Fonction 
         */
        public function getFonction()
        {
            return $this->fonction;
        }
     
        /**
         * Set personne
         *
         * @param Icme\MainBundle\Entity\Personne $personne
         */
        public function setPersonne(\Icme\MainBundle\Entity\Personne $personne)
        {
            $this->personne = $personne;
        }
     
        /**
         * Get personne
         *
         * @return Icme\MainBundle\Entity\Personne 
         */
        public function getPersonne()
        {
            return $this->personne;
        }
    }
    Le soucis vient au niveau du persist.

    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
     
    public function onSuccess(Piste $piste) 
    	{
                  // on persist les fonctions
    		foreach($piste->getPersonne()->getPersonnefonctions() as $pf)
    			$this->em->persist($pf->getFonction());
     
    		$this->em->flush();
     
    		// on persist la personne		
    		$this->em->persist($piste->getPersonne());
    		$this->em->flush();
     
    		// on persist les personnefonctions
    		foreach($piste->getPersonne()->getPersonnefonctions() as $pf)
    		{
    			$this->em->persist($pf);
    		}	
    		$this->em->flush();
    }

    J'ai cette erreur :
    A new entity was found through the relationship 'Icme\MainBundle\Entity\Personne#personnefonctions' that was not configured to cascade persist operations for entity: Icme\MainBundle\Entity\PersonneFonction@000000003309c69f000000001a6019c6. Explicitly persist the new entity or configure cascading persist operations on the relationship. If you cannot find out which entity causes the problem implement 'Icme\MainBundle\Entity\PersonneFonction#__toString()' to get a clue.


    Si je ne flush pas la personne avant le foreach sur les Personnefonctions, j'ai cette erreur :
    Entity of type Icme\MainBundle\Entity\PersonneFonction has identity through a foreign entity Icme\MainBundle\Entity\Personne, however this entity has no ientity itself. You have to call EntityManager#persist() on the related entity and make sure it an identifier was generated before trying to persist 'Icme\MainBundle\Entity\PersonneFonction'. In case of Post Insert ID Generation (such as MySQL Auto-Increment or PostgreSQL SERIAL) this means you have to call EntityManager#flush() between both persist operations.


    Lorsque j'ajoute le persist cascade sur personnefonctions dans Personne, j'ai cette même erreur également.


    Merci d'avance.
    Cordialement.

  2. #2
    Membre confirmé Avatar de Legenyes
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 174
    Par défaut
    J'ai le même problème.
    Si tu trouve la solution, prévient moi. Ce serait gentil.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 10
    Par défaut
    Bonjour,
    Je pense que tu dois ajouter un cascade={"persist"} sur la propriété personnefonctions de ton entité personne.
    Et si tu as un autre message d'erreur, tu enlèves les @ORM\id sur les propriétés personne et fonction de ton entité PersonneFonction et tu crées une colonne id sur cette même entité
    Ce n'est sans doute pas propre, mais de cette façon j'avais réussi à garder le controller le plus simple possible, Sf et Doctrine s'occupent du reste.

  4. #4
    Membre averti
    Inscrit en
    Août 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Août 2012
    Messages : 17
    Par défaut
    Merci de ta réponse.

    Le cascade persist j'avais déjà essayé mais toujours la même erreur.

    J'avais pensé également à mettre un id et enlever la clé primaire composée.
    Effectivement je viens d'essayer et ça marche impeccable !

    Dommage, je ne trouve pas ça très propre, mais on va faire avec

    Merci beaucoup

Discussions similaires

  1. [2.x] [Form] Type pour une relation ManyToMany avec attributs
    Par FadeToBlack dans le forum Symfony
    Réponses: 10
    Dernier message: 09/08/2014, 03h46
  2. [2.x] Formulaire relation ManyToMany avec attributs
    Par Trezegoals dans le forum Symfony
    Réponses: 0
    Dernier message: 08/08/2012, 16h00
  3. Relation ManyToMany avec attribut
    Par icl1c dans le forum Doctrine2
    Réponses: 0
    Dernier message: 09/03/2012, 11h44
  4. [Doctrine] Relation many2many avec attributs dans la classe refClass
    Par Sn00f dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 07/04/2010, 14h04
  5. Réponses: 8
    Dernier message: 27/02/2009, 01h37

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