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

Symfony PHP Discussion :

[Form] Type pour une relation ManyToMany avec attributs [2.x]


Sujet :

Symfony 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 [Form] Type pour une relation ManyToMany avec attributs
    Salut à tous,

    j'ai un petit problème concernant la génération de mon formType sur une relation manyTomany avec attributs.

    Je vous explique. J'ai deux tables :
    1) Table personne avec les infos habituelles
    2) Table pays

    Ensuite j'ai une relation "visiter", avec les attributs date1 et date2. Tout cela gère des séjours de vacanciers.

    Du coup je me crée les relations suivantes :
    Clients----(OneToMany)----visiter-----(ManyToOne)-----pays


    Ce qui me donne les entités suivantes (avec leur relations) :

    l'entité Client :

    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
    class Client
    {
    	/**
    	 * @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;
     
    	//.../....
     
    	/**
    	 * @ORM\OneToMany(targetEntity="Visiter", mappedBy="client")
    	 * @ORM\JoinColumn(nullable=true)
    	 */
    	private $visites;
     
     
    	public function __construct()
    	{
    		$this->visites = new ArrayCollection();
     
    	}
    }
    l'entité Visiter :

    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
    class Visiter
    {
     
    	/**
    	 * @ORM\Id
    	 * @ORM\ManyToOne(targetEntity="Client", inversedBy="parcours")
    	 * @ORM\JoinColumn(name="client_id", referencedColumnName="id", onDelete="cascade")
    	 */
    	private $client;
     
    	/**
    	 * @ORM\Id
    	 * @ORM\ManyToOne(targetEntity="Pays")
    	 */
    	private $pays;
     
    }
    l'entité pays:
    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
    class Pays
    {
    	/**
    	 * @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=30)
    	 */
    	private $nom;
    }

    Jusqu'ici tout va bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine/schema/generate
    me crée mes tables avec client_id et pays_id en clefs primaires (ensembles).


    Le problème vient du fait que je voudrais générer le VisiteType pour l'imbriquer dans le formulaire Client. Pour ce qui est de l'imbrication maintenant je sais faire.
    Néanmoins, je lance la génération via doctrine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine:generate:form ReservBundle:Visiter
    Et j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The form generator does not support entity classes with multiple primary keys
    JE ne peux modifier ma table "visiter" puisque les deux clefs primaires sont issues de la relation avec les tables clients et pays.

    Faut -t-il que je casse ces deux clefs primaires et me crée une clef visite_id comme je l'ai vu sur le net? Mais dans ce cas là est-ce que l'on ne contrevient pas à la bonne logique des BDD?

    Si vous avez une ou plusieurs idées. MErci d'avance
    Douter de tout, toujours, et surtout de soi-même...

  2. #2
    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 me réponds à moi même et en profite pour me filer une bonne tarte tellement je suis débile.

    Si j'ai des relations Clients---(OnetoMany)----Visiter----(ManyToOne)----Pays,
    la table Visiter ne peut pas être une table de liaison. Donc il n'y a pas de double clefs primaire.

    Je pense que le problème vient de ma mise à jour du schema.

    JE vais donc avoir une entité/table Visiter comme suit:
    visiter_id : clef primaire
    client_id : clef étrangère
    pays_id : clef étrangère
    les autres attributs.

    Si je me goure dites le moi.
    A+
    Douter de tout, toujours, et surtout de soi-même...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 174
    Points : 207
    Points
    207
    Par défaut
    Voici un petit exemple de ce que j'avais fais sur un autre projet.

    Je te laisse essayer de comprendre.
    Si tu as un soucis n'hesite pas

    Voici ma classe intermédiaire
    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
    class TypeOptionArticle  {
        
         /**
          * @ORM\Id
         * @ORM\ManyToOne(targetEntity="Anaprosy\EcommerceBundle\Entity\TypeArticle")
         */
        protected $type;
        
        /**
         * @ORM\Id
         * @ORM\ManyToOne(targetEntity="Anaprosy\EcommerceBundle\Entity\OptionArticle")
         */
        protected $option;
        
        
        /**
         * @ORM\Column(name="ordre", type="integer")
         */
        private $ordre;
        
    
        public function __construct() {
        }
    
        public function setType(\Anaprosy\EcommerceBundle\Entity\TypeArticle $type) {
            $this->type = $type;
        }
    
        public function getType() {
            return $this->type;
        }
    
        public function setOption(\Anaprosy\EcommerceBundle\Entity\OptionArticle $option) {
            $this->option = $option;
        }
    
        public function getOption() {
            return $this->option;
        }
        
        public function setOrdre($ordre) {
            $this->ordre = $ordre;
        }
    
        public function getOrdre() {
            return $this->ordre;
        }
    
    }
    http://www.anaprosy.be - Solution et réalisation informatique

  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
    Salut Legenyes,

    Comme tu as pu le voir, mon entité Visiter est assez similaire à la tienne avec des attributs en plus grand nombre.

    Je suis arrivé à ce même résultat. Le problème c'est que pour la création de mon formulaire imbriqué j'ai besoin de VisiterType et Doctrine me dit qu'il ne peut pas le générer avec deux clefs primaires dans la même entité.

    Pour être plus précis, je me base sur mon ClientType pour remplir toutes les informations classiques. J'ai ensuite un système d'onglet jquery. Dans l'un d'eux je doit imbriquer les infos de visiter donc un formulaire VisiterType.

    Et là çà coince
    Douter de tout, toujours, et surtout de soi-même...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 174
    Points : 207
    Points
    207
    Par défaut
    Peux tu nous montrer ton formType et ton entity
    http://www.anaprosy.be - Solution et réalisation informatique

  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
    Re..

    Alors avec les modifs l'entité visiter 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
    class Visiter
    {
    /**
    	 * @var integer $id
    	 *
    	 * @ORM\Column(name="id", type="integer")
    	 * @ORM\Id
    	 * @ORM\GeneratedValue(strategy="AUTO")
    	 */
    	private $id;
     
     
    	/**
    	 * @ORM\ManyToOne(targetEntity="Client", inversedBy="parcours")
    	 * @ORM\JoinColumn(name="client_id", referencedColumnName="id", onDelete="cascade")
    	 */
    	private $client;
     
    	/**
    	 * @ORM\ManyToOne(targetEntity="Pays")
    	 */
    	private $pays;
     
    	/**
    	 * @var \DateTime $dateDebut
    	 *
    	 * @ORM\Column(name="dateDebut", type="datetime", nullable=true)
    	 */
    	private $dateDebut;
     
    	/**
    	 * @var \DateTime $dateFin
    	 *
    	 * @ORM\Column(name="dateFin", type="datetime", nullable=true)
    	 */
    	private $dateFin;
    et le visiterType

    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
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    	$builder
    	->add('dateDebut', 'date', array('widget' 		=> 'single_text',
                								'format'		=> 'dd/MM/yyyy',
                                                'data_timezone' => "Europe/Paris",
                                                'user_timezone' => "Europe/Paris",
              									'label' 		=> 'Date de départ : ',
              									'attr'			=>	array('placeholder'=>"jj/mm/aaaa")
                                                        )
              		)
         ->add('dateFin', 'date', array('widget' 		=> 'single_text',
              								'format'		=> 'dd/MM/yyyy',
              								'data_timezone' => "Europe/Paris",
              								'user_timezone' => "Europe/Paris",
              								'label' 		=> 'Date de retour : ',
              								'attr'			=>	array('placeholder'=>"jj/mm/aaaa")
              		)
              		)
    	            ->add('pays', 'entity', array('label'			=>	'Nationalité : ',
    			            								'required'		=>	false,
    			            								'class'			=> 'BaseBundle:Pays',
    										      			'property' 		=> 'nom',
    										      			'empty_value' 	=> 'Choisissez...',
    										      			'query_builder' => function(EntityRepository $em) {
    			      																return $em->createQueryBuilder('s')
    							        														->orderBy('s.nom', 'ASC');},
    							        						))
    Douter de tout, toujours, et surtout de soi-même...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 174
    Points : 207
    Points
    207
    Par défaut
    voila ce que je te propose c'est de retirer ceci
    @ORM\GeneratedValue(strategy="AUTO")

    et de rajouter @ORM\Id au deux relation de ton entity
    (comme sur mon exemple)

    Tu aura donc une seule clé primaire mais composé des deux champs.


    Ensuite pour ton ClientType je te propse da rajouter cici pour ajouter ta relation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //...
    ->add('visiter', 'collection', array(
                        'type' => new visiterType(),
                        'allow_add' => true,
                        'allow_delete' => true,
                        'by_reference' => false))
    //...
    http://www.anaprosy.be - Solution et réalisation informatique

  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
    bon j'ai refais mon entity et le formType de ta manière.

    Mais du coup, je n'ai pas généré le VisiterType via doctrine avec
    php app/console doctrine:generate:form etc.....

    parce que cela me met toujours la même erreur. Il ne veut pas créer de formulaire avec deux clefs primaire.

    Mais a priori en le créant à la mano, cela à l'air de fonctionner.
    Douter de tout, toujours, et surtout de soi-même...

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 174
    Points : 207
    Points
    207
    Par défaut
    Faut parfois mettre un peu la main dans le cambouis
    http://www.anaprosy.be - Solution et réalisation informatique

  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
    Ouais, je sais pour un autre truc, je ne suis pas arrivé à faire une bonne importation des tables de ma base avec doctrine. Du coup 30 tables et 250 champs à la mano.

    Je commence à bien aimer symfony et sa puissance, mais j'avoue être un peu déçu par doctrine. Dans les faits c'est absolument hallucinant le pouvoir de ce truc, mais d'un autre coté, on est un peu obligé de prendre des largesses avec les lois de la construction des bases et avec les formes normales.

    C'est dommage.
    Douter de tout, toujours, et surtout de soi-même...

  11. #11
    Membre régulier
    Inscrit en
    Octobre 2008
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 128
    Points : 79
    Points
    79
    Par défaut
    Salut , t'a trouvé une solution ? j'ai le même probléme

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

Discussions similaires

  1. Persist relation ManyToMany avec attributs
    Par Trezegoals dans le forum Doctrine2
    Réponses: 3
    Dernier message: 22/08/2012, 21h55
  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. Réponses: 8
    Dernier message: 25/10/2011, 10h18
  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