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 :

Formulaire avec une relation oneToOne


Sujet :

Doctrine2 PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Formulaire avec une relation oneToOne
    Bonjour à tous,

    J'ai un petit problème de conception. Pour commencer je précise que je travaille avec une base mySql existante, donc j'ai mapper la base pour créer les entités.

    Voilà mon problème:

    Je possède une table adresse qui contient une clé vers client et une clé vers fournisseur. Les deux clés sont dans la table adresse pour pouvoir faire des on delete cascade. Mais le problème c'est que je ne sais pas comment imbriquer le formulaire de la table adresse dans client ou fournisseur vu que ceux-ci ne contiennent aucunes informations sur leur adresse.
    Donc faire quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('cliAdr', new AdresseForm(),array('label'=>'Adresse'))
    J'espère avoir été assez clair et que vous pourrez m'aidez. Merci

  2. #2
    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
    tu as configuré ta relation en bidirectionnel?
    http://readthedocs.org/docs/doctrine...-bidirectional

    dans un second temps il faut prendre en compte la notion de owning-side et inverse side:
    http://www.developpez.net/forums/d11...y/#post6408197

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Bonjour,

    Merci de l'aide apportée. Maintenant j'arrive à afficher le formulaire de l'adresse en même temps que le client. Quand j'ajoute un nouveau client avec une adresse ça enregistre dans les deux tables, mais la valeur de la clé étrangère dans adresse, n'est pas remplie, je ne comprends pas pourquoi.

    Voici mon code:

    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
    class Personne
    {
        /*...*/
        /**
         *@ORM\OneToOne(targetEntity="DalAdresse", mappedBy="adrPer")
         */
        public $perAdr;
     
        public function getPerAdr()
        {
            return $this->perAdr;
        }
     
        /**
         * Set perAdr
         *
         * @param Dal\BaseBundle\Entity\DalAdresse $perAdr
         */
        public function setPerAdr($perAdr)
        {
            $this->perAdr = $perAdr;
        }
    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
    class Adresse
    {   /**
         * @var Personne
         *
         * @ORM\ManyToOne(targetEntity="Personne")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="adr_per_id", referencedColumnName="per_id")
         * })
         */
        private $adrPer;
     
    **
         * Set adrPer
         *
         * @param Dal\BaseBundle\Entity\Personne $adrPer
         */
        public function setAdrPer(\BaseBundle\Entity\Personne $adrPer)
        {
            $this->adrPer = $adrPer;
        }
     
        /**
         * Get adrPer
         *
         * @return BaseBundle\Entity\Personne 
         */
        public function getAdrPer()
        {
            return $this->adrPer;
        }
    }
    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
    class ClientForm extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {        
     
     
            $builder
                //->add('perId','text',array('label'=>'ID'))
                ->add('perTitre','choice',array('label' => 'Titre','choices' => array('m' =>'M.','mme' => 'Mme','me'=>'Me','dr'=>'Dr'),'empty_value' => ' ',
    'empty_data'  => null))
                    ->add('perPrenom','text',array('label'=>'Prénom'))
    			->add('perNom','text',array('label'=>'Nom'))
    			->add('perNomSociete','text',array('label'=>'Entreprise'))
    			->add('perNewsletter', 'checkbox', array('label'     => 'Abonné newsletter','required'  => false))
    			->add('perRemarques','textarea',array('label'=>'Remarques'))
                ->add('perDateNaiss', 'birthday',array('label'=>'Date de naissance'))
                    ->add('perLangue', 'language',array('label'=>'Langue'))
                    ->add('perEmail', 'email',array('label'=>'Email'))
                    ->add('perType', 'text',array('label'=>'Type'))
                    ->add('perAdr', new AdresseForm(),array('label'=>'Adresse'))
    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
    $em = $this->getDoctrine()->getEntityManager();
     
        if (isset($perId)) 
        {
            // modification d'un client existant : on recherche ses donn�es
            $client = $em->getRepository('BaseBundle:Personne')->find($perId);
     
     
            if (!$client)
            {
                $message='Aucun client trouvé';
            }
        }
        else 
        {
            // ajout d'un nouveau client
            $client = new Personne();
        }
     
        $form = $this->createForm(new ClientForm(), $client);
     
        $request = $this->container->get('request');
     
        if ($request->getMethod() == 'POST') 
        {
                  $form->bindRequest($request);
     
        if ($form->isValid()) 
        {
            $em->persist($client);
            $em->persist($client->getPerAdr());
            $em->flush();
    Merci de votre aide.

  4. #4
    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
    Ce n'est pas cohérent d'avoir une relation OneToOne d'un coté et ManyToMany de l'autre.

    En partant du principe que c'est une relation OneToOne (Adresse has one Personne et personne has One Adresse)
    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
    //Adresse.php
    /** ici le owning side de la  relation, Doctrine se base sur cet attribut pour mettre à jour la clé étrangère
    *
    * @ORM\OneToOne(targetEntity="Personne")
    * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="adr_per_id", referencedColumnName="per_id")
     * })
     */
    private $adrPer;
    
    /*****/
    
    /**
    * Set adrPer
     *
    * @param Dal\BaseBundle\Entity\Personne $adrPer
    */
     public function setAdrPer(\BaseBundle\Entity\Personne $adrPer)
    {
       $this->adrPer = $adrPer;
    }
    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
    //Personne.php
    /**
    * le inverse side de la relation, Doctrine ne s'en occupe pour le calcul des champs à mettre à jour
    *@ORM\OneToOne(targetEntity="DalAdresse", mappedBy="adrPer")
     */
    protected $perAdr;
    
    /******/
    
    /**
    * cette méthode sera appelé par le formulaire
    * Set perAdr
     * 
    * @param Dal\BaseBundle\Entity\DalAdresse $perAdr
    */
    public function setPerAdr( $perAdr)
    {
       $this->perAdr = $perAdr;
       $perAdr->setAdrPer($this);//cette ligne permet de signifier à l'entité Adresse qu'elle est liée à l'entité Personne 
    }
    vérifie aussi les noms: ton entité s'appelle Adresse ou bien DalAdresse.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2011
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Merci infiniment de ton aide arnoo!

    C'est en effet une relation OneToOne.

    Merci.

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

Discussions similaires

  1. [2.x] [Formulaire] Créer une entité avec une relation ManyToMany
    Par SalutAVous dans le forum Symfony
    Réponses: 3
    Dernier message: 30/10/2012, 22h13
  2. Une entité avec plusieurs relations oneToOne
    Par ray-k dans le forum Doctrine2
    Réponses: 5
    Dernier message: 03/08/2012, 15h55
  3. Réponses: 4
    Dernier message: 06/02/2012, 09h55
  4. probleme avec une relation OneToOne
    Par aniss77 dans le forum JPA
    Réponses: 1
    Dernier message: 01/04/2010, 22h07
  5. Execution formulaire avec une variable
    Par dsj dans le forum Access
    Réponses: 9
    Dernier message: 08/09/2005, 19h46

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