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 :

Persistance: Many To Many avec attributs


Sujet :

Doctrine2 PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut Persistance: Many To Many avec attributs
    Bonjour,

    J'ai modélisé une relation many to many avec attributs de cette manière:

    L'entité: DossierTransport
    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
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="dossiertransport")
     */
    class DossierTransport
    {
    .........
     
        /**
         * 
         * @ORM\OneToMany(targetEntity="DossierTransportProduit", mappedBy="dossiertransport", cascade={"persist"})
    	 * @Assert\NotBlank(message = "items ne doit pas etre vide")
         */
        protected $items;
     
    ...........
    }
    L'entité: DossierTransportProduit

    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
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="dossiertransportproduit")
     */
    class DossierTransportProduit
    {
    ....
    	 /**
    	 *
    	 * @ORM\ManyToOne(targetEntity="DossierTransport", inversedBy="items")
    	 * 
         */
        protected $dossiertransport;
     
    	/**
       * @ORM\ManyToOne(targetEntity="Produit")
       * @ORM\JoinColumn(nullable=false)
       */
    	private $produit;
     
    ...
    }
    L'entite Produit

    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
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="produit")
     */
    class Produit
    {
        /**
         * @var integer
         *
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        protected $id;
     
     
    	  /**
         *
         * @ORM\Column(type="string")
         * @Assert\NotBlank()
         * @Assert\MinLength(5)
         */
        protected $reference;
     
    ..}
    et dans le contrôleur j'ai:

    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
     
    	$form = $this->container->get('form.factory')->create(new DossierTransportFormType(), $dossiertransport);
     
    	$request = $this->container->get('request');
     
    	if ($request->getMethod() == 'POST') 
    	{
        	  	$form->bindRequest($request);
    			//$form2->bindRequest($request);
     
    	if ($form->isValid()) 
    	{	
     
    		$em->persist($dossiertransport);
     
    		$em->flush();
     
    	}
    Après validation les données s’enregistre dans les trois tables sauf que dans la table de liaison "dossiertransportproduit" l'id "dossiertransport_id"(clé étrangère: id dossiertansport) j'ai la valeur NULL.


    Je me demande est ce dois-je ajouter quelque chose dans le contrôleur pour remédier à ça?

    Merci

  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
    Bonjour,

    il faut ajouter ça dans ton controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $transportProduit = new DossierTransportProduit();
    $transportProduit->setDossierTransportProduit(dossiertransport);
    $em->persist($transportProduit);

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    oui c'est vrai on doit setter l'objet dossierTransport, avec un code du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $transportProduit->setDossierTransport($dossierTransport);

    Mais.............Je m'excuse d'abord parce que je n'ai pas ajouté une partie de mon code dans mon premier post; je m'explique:

    J'ai un formulaire imbriqué du genre:

    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
     
    class DossierTransportFormType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
     
    			->add('client', 'entity', array(
    			'label' => 'dossiertransport.client',
    	        'class' => 'Isea\AgtsBundle\Entity\Client',
    	        'property' => 'nomSociete',
                ))
     
     
     
                ->add('numeroContenair', 'text', array('label' => 'dossiertransport.numeroContenair'))
    			->add('numeroDocTransport', 'text', array('label' => 'dossiertransport.numeroDocTransport'))
    			->add('dateSaisie', 'date', array('label' => 'dossiertransport.dateSaisie'))
    			->add('observation', 'text', array('label' => 'dossiertransport.observation'))
     
     
                ->add('items', 'collection', array(
                    'type'         => new Type\DossierTransportProduitType(),
                    'allow_add'    => true,
                    'allow_delete' => true,
                    'prototype'    => true,
                ))
            ;
        }
     
        public function getName()
        {
            return 'dossiertransport';
        }
    }
    et le sous formulaire:

    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
     
    class DossierTransportProduitType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
     
            ->add('produit', 'entity', array(
                    'label' => 'produit.reference',
    	        'class' => 'Isea\AgtsBundle\Entity\Produit',
    	        'property' => 'reference',
                    'query_builder' => function ($repository) { return $repository->createQueryBuilder('p'); },
                ))
     
     
    		->add('detailLot', 'text')
    		->add('numeroLot', 'text')
    		;
        }
     
        public function getDefaultOptions(array $options)
        {
            return array('data_class' => 'Isea\AgtsBundle\Entity\DossierTransportProduit');
        }
     
         public function getName()
        {
            return 'dossiertransport';
        }
    }
    Le code actuel du contrôleur est:

    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
     
    $form = $this->container->get('form.factory')->create(new DossierTransportFormType(), $dossierTransport);
     
    	$request = $this->container->get('request');
     
    	if ($request->getMethod() == 'POST') 
    	{
        	  	$form->bindRequest($request);
    			//$form2->bindRequest($request);
     
    	if ($form->isValid()) 
    	{		
     
     
    		$em->persist($dossierTransport);
     
    }}

    Je me demande est ce qu'il y a aurait une possibilité de récupérer l'instance de "DossierTransportProduit" crée à l'aide du formulaire, pour lui setter l'information manquante.


    Merci d'avance.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2011
    Messages : 93
    Points : 53
    Points
    53
    Par défaut
    Bonjour,


    c'est réglé pour moi, j'ai suivi et l'exemple: https://github.com/beberlei/AcmePizzaBundle




    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Persister une entity Many to many
    Par iDev.06 dans le forum Symfony
    Réponses: 5
    Dernier message: 27/05/2015, 06h58
  2. Réponses: 5
    Dernier message: 10/08/2014, 17h25
  3. [sqlalchemy] Création d'une relation Many to Many avec attributs
    Par joubu dans le forum Bibliothèques tierces
    Réponses: 6
    Dernier message: 05/08/2010, 20h13
  4. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  5. Réponses: 3
    Dernier message: 01/03/2007, 14h51

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