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 :

Sauvegarde relation OneToOne dans Symfony 2


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut Sauvegarde relation OneToOne dans Symfony 2
    Bonsoir tout le monde !!!


    je galère sur un problème tout simple (à priori) ... :-(


    j'ai deux classes en one to one bidirection dont je n'arrive pas à sauvegarder :-(

    une première classe user :

    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
     
    class User extends BaseUser
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\OneToOne(targetEntity="VolleyBundle\Entity\Club", cascade={"persist", "merge", "remove"}, mappedBy="user")
         * @ORM\JoinColumn(name="club_id", referencedColumnName="id")
         */
        protected $club;
    ...
    et une seconde classe club :

    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
     
    class Club
    {
        /**
         * @ORM\GeneratedValue
         * @ORM\Id
         * @ORM\Column(name="id", type="integer")
         */
        protected $id;
     
        /**
         * @ORM\OneToOne(targetEntity="UserBundle\Entity\User", inversedBy="club")
         * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
         */
        protected $user;
     
        /**
         * Nom
         * @ORM\Column(name="strNom", type="string", length=50, nullable=true)
         */
        protected $strNom;
    j'ai un premier formulaire de création d'user qui fonctionne ... ca génère un user

    par contre mon soucis se situe lors de la création d'un club :
    comment lier les deux tables à la sauvegarde ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $club = new Club();
    $form = $this->container->get('form.factory')->create(new ClubForm(), $club);
    $em->persist($club);
    $em->flush();

    Merci d'avance pour votre aide !!!

  2. #2
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    tu veux dire qu'un user appartient à un club ?
    -> pas besoin de mettre un oneToOne des 2 cotés !

    ou plutôt que 1..plusieurs user appartiennent à un club ?
    -> c'est donc un ManyToOne qu'il faut faire, non ?


    en plus tu as oublié les setter et getter de tes attributs ....

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut :-)
    Merci pour ta réponse dukoid !


    un user est considéré comme un président !

    un User peut présider un seul Club
    un Club ne peut être présidé que par un User

    je ne vous ai pas encombré des getter/setter dans ma question (généré automatiquement par doctrine) :-)

  4. #4
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    ok président.

    dans ce cas, il faut setter le président au club ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $user = ????;
     
    $club = new Club();
    $club->SetUser( $user );
    ....

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut :-)
    OK Merci dukoid !!!

    ton code permet de relier uniquement de club vers user ! nul besoin de faire l'inverse (sachant que j'ai coder en one to one bidirection ???

  6. #6
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    je ne suis pas trop doué sur tout ce qui est doctrine et co, j'aime pas ça.

    il me semble qu'avec un oneToOne bidirectionnel une table intermédiaire est automatiquement créé (géré par doctrine), c'est le cas non ?


    club .............. club_user .............. user
    .................... id_club
    .................... id_user

    ainsi quand tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $user = ????;
     
    $club = new Club();
    $club->SetUser( $user );
    $em->persist($club);
    un enregistrement est créé dans la table intermédiaire avec id_club et id_user.


    il te suffit de tester, et de voir en base ce que ça donne ? histoire de comprendre le fonctionnement...

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    ok dukoid, je testerai ce soir.

    Merci beaucoup :-)

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    salut !

    comme prévu, l'enregistrement dans la table Club s'est correctement réalisé avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $club = new Club();
    $club->setUser($this->container->get('security.context')->getToken()->getUser());
    $em->persist($club);
    par contre aucune info ne s'est enregistrée dans la table User (aucune table "intermédiaire" n'a été générée/renseignée)...

  9. #9
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $user = $this->container->get('security.context')->getToken()->getUser();
     
    $club = new Club();
    $club->setUser($user);
    $em->persist($club);
     
    $user ->setClub($user);
    $em->persist($user );
    ?????

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    alors ... je ne sais pas si c'est la bonne méthode mais voici ma façon de faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // récupération du l'User
    $varUser = $this->container->get('security.context')->getToken()->getUser();
     
    // affectation de l'User dans la table Club
    $club->setUser($varUser);				
     
    // affectation du club dans la table User				
    $user = $em->find('UserBundle:User', $varUser);
    $user->setClub($club);
     
    $em->persist($club);
    $em->persist($user);
    ca marche ! mais est-ce la bonne méthode...

    :-)

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 78
    Points : 46
    Points
    46
    Par défaut
    allez hop ...
    je crois que là on est bon !!!


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $user = $this->container->get('security.context')->getToken()->getUser();
     
    $club->setUser($user);
    $em->persist($club);
     
    $user->setClub($club);
    $em->persist($user);
    Merci énormément pour ton aide dukoid !!!!!!!!!!!!!!!!!!

Discussions similaires

  1. [EJB3.1] Plusieurs relation OneToOne vers la même entité.
    Par piemur2000 dans le forum Java EE
    Réponses: 1
    Dernier message: 11/01/2011, 09h05
  2. probleme avec une relation OneToOne
    Par aniss77 dans le forum JPA
    Réponses: 1
    Dernier message: 01/04/2010, 22h07
  3. Relation OneToOne en HQL
    Par aigleborgne dans le forum JPA
    Réponses: 1
    Dernier message: 04/09/2009, 14h18
  4. Réponses: 1
    Dernier message: 16/12/2008, 14h38
  5. [Nhibernate] Relation OneToOne
    Par Vercity dans le forum NHibernate
    Réponses: 1
    Dernier message: 12/03/2007, 11h36

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