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 :

récupérer l'id dans une relation OneToOne sans requête supplémentaire


Sujet :

Doctrine2 PHP

  1. #1
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut récupérer l'id dans une relation OneToOne sans requête supplémentaire
    Bonsoir,

    Ma question est un peu contraire au concept d'abstraction de la base de données de Doctrine ...

    j'ai une première entité Lien liée à une autre entité Noeud par une relation OneToOne.
    Je voudrais récupérer en une requête l'identifiant de mon instance de Noeud à partir d'une instance de Lien :
    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
     
    class Lien {
     
        /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
        protected $id;
     
        /** @ORM\OneToOne(targetEntity="Noeud") */
        protected $noeud;
     
        public function getId() {
            return $this->id;
        }
     
        public function getNoeud() {
            return $this->noeud;
        }     
     
        ...
    }
     
     
    class Noeud {
     
        /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
        protected $id;
     
        public function getId() {
            return $this->id;
        }  
     
        ...
    }
    la clé primaire d'un enregistrement d'une table noeud liée à l'entité Noeud, est stockée en base de donnée dans une colonne "noeud_id" dans la table lien liée à la classe Lien.

    Jusqu'à maintenant j'effectuais la commande ci-après dans mon controlleur sous Symfony.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function afficheLienAction($id) {
     
        $lien = $this->getDoctrine()->getEntityManager()->find('MonBundle:Lien', $id);
     
        $noeud = $lien->getNoeud();
        $idNoeud = $noeud->getId();
     
    }
    l'exécution du code nécessite 2 requêtes :
    1. une première dans la table lien
    2. une seconde dans la table noeud


    la 2e est inutile pour accéder à l'identifiant de mon instance de Noeud.


    y a-t-il possibilité de récupérer cet identifiant en une seule requête ?
    l'entité proxy de Noeud possède la fameuse variable _identifier mais elle est privée j'ai envie de lui rajouter une fonction getter...

    Merci d'avance pour vos réponses !!
    Bonne soirée

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

    tu peux ajouter l'annotation fetch EAGER cela chargera automatiquement les entitée Lien et Noeud en une seule requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Lien {
        /** @ORM\OneToOne(targetEntity="Noeud",fetch="EAGER") */
        protected $noeud;
    }

  3. #3
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Merci beaucoup !
    Néanmoins, existe-t-il un moyen d'y arriver sans que Doctrine effectue cette jointure, dans le cas où l'on ne recherche que l'id qui est déjà présent dans la première table ?

  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
    Avec Doctrine2, on ne peut pas vraiment travailler avec des clé étrangères (à la différence de Doctrine1).

    Je dirais que tu es obligé de passer par une jointure (mais je peut me tromper!).

    Néanmoins lorsque l'on passe par un ORM comme Doctrine, on perd forcément en rapidité d'éxécution et en souplesse coté SQL.

    A partir de là est-il pertinent de chercher à éviter une jointure, qui te fera économiser quelques milli-secondes?

    Dans ton application ,pourquoi as-tu besoin de l'id de Noeud et pas de l'objet Noeud lui-même?

  5. #5
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Merci pour ta réponse...
    Afin de trier un stock de photos, je stocke des images dans un dossier au nom de l'identifiant de la galerie, peut-être est-ce une mauvaise pratique ?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Si tu veux juste recuperer l'information, il est possible de creer deux variables dans ton entité.

    La premiere sera ta relation; la seconde un bete champ integer.
    Ainsi tu peux récupérer l'id avec le getter de la seconde variable (ne pas mettre de setter!!).

    Je fais ceci : http://www.developpez.net/forums/d11...-modification/
    Dans mon cas, le champ est un champ texte; ce qui me pose un probleme pour mettre une valeur... mais c'est une autre discussion.

    Dans ton cas, tu devras sans doute mettre une ligne supplémentaire dans le setter de la relation qui change la valeur de la variable id.
    Un petit si la réponse convient. Merci.

  7. #7
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    oh merci !
    Quelle bonne idée je vais essayer tout de suite !

  8. #8
    Membre du Club
    Homme Profil pro
    developpeur
    Inscrit en
    Février 2010
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : developpeur

    Informations forums :
    Inscription : Février 2010
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Merci ça fonctionne parfaitement !

    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
     
     
    class Lien {
     
        /** @ORM\Id @ORM\Column(type="integer") @ORM\GeneratedValue */
        private $id;
     
     
         /** @ORM\OneToOne(targetEntity="Noeud")
         * @ORM\JoinColumn(name="lien_noeud_id", referencedColumnName="id")
         */
        private $noeud;
     
        /**
         * @ORM\Column(name="lien_noeud_id", type="integer", nullable=true)
         */
        private $idNoeud;
     
     
        public function getId() {
            return $this->id;
        }
     
        public function getIdNoeud() {
            return $this->idNoeud;
        } 
     
        public function getNoeud() {
            return $this->noeud;
        }
     
        public function setNoeud($noeud)
        {
            $this->noeud = $noeud;
            $this->idNoeud = $noeud->getId();
        }     
     
        ...
    }
    J'ai procédé ainsi.
    Je reste pourtant perplexe et n'arrive pas à comprendre : ma variable idNoeud est privée, elle est pourtant hydratée lors de la récupération des données mais comment ?? je n'ai pas mis de setter !!!

    bonne soirée

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Bah si , tu as mis ceci dans le setter du noeud:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->idNoeud = $noeud->getId();
    Tu peux mettre en résolu?
    Un petit si la réponse convient. Merci.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/07/2014, 20h52
  2. Récupérer données dans une relation many to one
    Par phpestpuissant dans le forum Seam
    Réponses: 1
    Dernier message: 17/10/2012, 00h08
  3. [2.x] Récupérer un paramètre dans une Route sans l'afficher ?
    Par tbreton dans le forum Symfony
    Réponses: 2
    Dernier message: 20/07/2011, 08h51
  4. [Sécurité] comment récupérer le subject dans une page jsp?
    Par lalakers dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 13/07/2005, 11h42
  5. Réponses: 5
    Dernier message: 27/05/2005, 17h10

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