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 :

FOSUserBundle et relations entre entités [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut FOSUserBundle et relations entre entités
    Bonjour,
    J'ai surchargé le formulaire d'inscription du FOSUB pour ajouter des champs dont certains issus de relation... Après avoir galéré avec les relations de type OneToOne j'ai réussi, grâce à votre aide, à les faire s'enregistrer dans la base de données.

    Aujourd'hui je reviens vers vous pour un problème lors de la persistance de relations bidirectionnelles OneToMany et ManyToOne.

    Voici ma relation :
    Logement :
    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
    /**
         * @ORM\OneToMany(targetEntity="projet\BackOfficeBundle\Entity\Photo", mappedBy="logement", cascade={"persist", "remove"})
         */
        private $photos;
     
        public function __construct() {
            $this->photos = new \Doctrine\Common\Collections\ArrayCollection();
        }
     
        /**
         * Get photos
         *
         * @return Doctrine\Common\Collections\Collection 
         */
        public function getPhotos()
        {
            return $this->photos;
        }
     
        /**
         * Set photos
         *
         * @param Doctrine\Common\Collections\Collection 
         */
        public function setPhotos($photos)
        {
            $this->photos = $photos;
        }
     
        /**
         * Add photos
         *
         * @param projet\BackOfficeBundle\Entity\Photo $photos
         */
        public function addPhoto(\projet\BackOfficeBundle\Entity\Photo $photos)
        {
            $this->photos[] = $photos;
        }
    Photo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    /**
         * @ORM\ManyToOne(targetEntity="projet\BackOfficeBundle\Entity\Logement", inversedBy="photos")
         * @ORM\JoinColumn(name="logement", referencedColumnName="log_id")
         */
        private $logement;
    Quand l'utilisateur s'enregistre et ajoute des photos pour son logement, les lignes correspondantes s'ajoutent bien en base de données mais il n'y a pas de relation (le champ logement dans la table photos est à null).
    Du coup pas moyen de récupérer la liste des photos d'un logement en faisant $logement->getPhotos().

    Est-ce normal ?

    Comment puis-je faire pour avoir ce genre de relation persistée ?

    Merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    je connais rien a SF, mais du coup \Entity\Photo permet d'avoir, Entity qui déclenche surement l'id de la personne, donc voir si avec getPhotos() tu n'a pas besoin d’étendre \Entity en premier lieux
    Conception / Dev

  3. #3
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    En fait Entity est le dossier contenant les "Entités" (mot Symfony2 qui désigne les classes PHP décrivant les tables de la BDD pour l'ORM). Ce n'est pas une classe et je ne peux donc pas l'étendre....
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  4. #4
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Bonjour,

    Quand tu ajoutes tes photos, il faut les lier au client si tu veux que $logement->getPhotos() retourne quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /**
         * Add photos
         *
         * @param projet\BackOfficeBundle\Entity\Photo $photos
         */
        public function addPhoto(\projet\BackOfficeBundle\Entity\Photo $photos)
        {
            $this->photos[] = $photos;
            $photos->setLogement($this);
        }

  5. #5
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Bonjour,

    Je pense que la facon d'enregistrer est mal pensée d'après ce que je comprends.

    l'utilisateur est sur la page de création du logement, et il peut ajouter des photos avant de sauvegarder.

    Ce que je ferait donc,
    insérer les photos dans la table avec logement = null
    récupérer l'id au fur et a mesure
    lors de la validation, faire un setLogement sur toutes ces photos.

    Si tu veux a tout prix une contrainte not null sur logement, alors il faut crééer une table photo temp, et lors de l'enregistrement d'un logement aller chercher tous les ID dans cette table, récupérer les données associées et recreer les lignes dans la table photo.

    Bon courage.

  6. #6
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    @Francesco34 : J'ai essayé ta méthode mais ça ne fonctionne pas mieux en fait...

    @pmithrandir : En fait ce formulaire est sur le formulaire d'inscription (Un utilisateur s'inscrit en renseignant des informations sur lui et son logement) et l'enregistrement en base de données c'est le FOSUserBundle qui fait ça...
    Du coup si j'ai bien compris tout ce que tu m'as dit (rien n'est moins sûr) pour avoir absolument autre chose que null dans la colonne logement de ma table Photos je dois surcharger le FormHandler du FOSUB afin de persister mes entités comme je le désire ?

    Merci d'avance
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  7. #7
    Expert éminent
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 418
    Points : 7 295
    Points
    7 295
    Par défaut
    Question :
    est ce que l'utilisateur envoie les photos(en ajax par exemple) avant d'appuyer sur l'enregistrement de login ou pas ?

    Si cen'est pas le cas, il faut effectivement que tu surcharge la sauvegarde de l'utilisateur pour définir une valeur a la place du null..

    Si c'est ca, je veux bien la solution aussi, parce que je galère sur le même genre de problème.

  8. #8
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par pmithrandir Voir le message
    Question :
    est ce que l'utilisateur envoie les photos(en ajax par exemple) avant d'appuyer sur l'enregistrement de login ou pas ?

    Si cen'est pas le cas, il faut effectivement que tu surcharge la sauvegarde de l'utilisateur pour définir une valeur a la place du null..

    Si c'est ca, je veux bien la solution aussi, parce que je galère sur le même genre de problème.
    Ce que j'avais fait c'est que j'avais inclus dans le formulaire Logement (lui-même inclus dans le formulaire User) une collection avec l'option type => new PhotoType().
    Mon formulaire PhotoType ne contient qu'un champ (le chemin) en hidden.
    L'utilisateur envoies les photos en Ajax et à chaque photo je remplis la valeur de l'hidden avec le chemin de la photo nouvellement uploadée.

    Ca fonctionne (cad que lors de la soumission du formulaire j'ai bien des lignes créées dans ma table) le seul truc c'est que je n'ai pas le lien vers logement...
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

  9. #9
    Membre habitué
    Homme Profil pro
    Chef d'entreprise
    Inscrit en
    Mai 2011
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef d'entreprise
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2011
    Messages : 122
    Points : 169
    Points
    169
    Par défaut
    Je n'avais pas fait attention au fait que tu étais sur le formulaire d'inscription. En fait, quand tu enregistres tes photos, le logement n'existe pas encore dans la base; il est donc logique que tu n'es pas de lien.
    Je pense qu'il faut que tu regardes du côté des listeners et de l'événement postUpdate de Doctrine.

  10. #10
    Membre habitué Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 177
    Points
    177
    Par défaut
    Merci !!
    J'ai fait un Listener et ça fonctionne.

    Merci beaucoup !
    [/HS]

    J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source

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

Discussions similaires

  1. [2.x] Relation entre entité
    Par lodizzz dans le forum Symfony
    Réponses: 1
    Dernier message: 12/01/2012, 11h06
  2. [2.x] relations entre entités ManyToOne ou ManyToMany
    Par ziemelitis dans le forum Symfony
    Réponses: 5
    Dernier message: 02/01/2012, 18h19
  3. relation entre entités dans microsoft crm
    Par bssouf21 dans le forum Microsoft Dynamics CRM
    Réponses: 3
    Dernier message: 06/12/2011, 18h44
  4. relation entre entités dans microsoft crm
    Par bssouf21 dans le forum Microsoft Dynamics CRM
    Réponses: 0
    Dernier message: 05/12/2011, 10h20
  5. Relation entre entités dans différents bundles
    Par benderpremier dans le forum Doctrine2
    Réponses: 6
    Dernier message: 24/06/2011, 04h06

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