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

ORM PHP Discussion :

Relier 2 entités de manière bidirectionnelle


Sujet :

ORM PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 159
    Points : 84
    Points
    84
    Par défaut Relier 2 entités de manière bidirectionnelle
    Bonjour,

    Je m'arrache un peu les cheveux sur une problème avec les entités. J’espère que quelqu'un pourra m'aider, j ai essayé une multitude de combinaison et rien ne fonctionne.

    J'ai migré une base de données mysql en entités dans symfony. Cette base de données avait un système de clé primaire où la nomenclature n'était pas avec des "id" comme l'attends symfony.

    J'ai 2 tables utilisateur et vehicule. Un utilisateur peut avoir qu'un vehicule et un vehicule peut avoir plusieurs utilisateurs.

    Dans la table Utilisateur j'ai num_util qui est la clé primaire
    Dans la table Vehicule j ai num_vehicule qui est la clé primaire et num_util qui est la clé étrangere


    Entité utilisateur :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    <?php
     
    namespace AKH\RootBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Utilisateur
     *
     * @ORM\Table(name="utilisateur", indexes={@ORM\Index(name="fnum_client", columns={"num_client"}), @ORM\Index(name="fniveau_acces", columns={"niveau_acces"}), @ORM\Index(name="fsuperuser", columns={"superuser"}), @ORM\Index(name="fnom", columns={"nom"}), @ORM\Index(name="fprenom", columns={"prenom"}), @ORM\Index(name="fnum_part", columns={"num_part"})})
     * @ORM\Entity
     */
    class Utilisateur
    {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="num_util", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $numutil;
     
     
        /**
         * Get numUtil
         *
         * @return integer
         */
        public function getNumUtil()
        {
            return $this->numutil;
        }
     
     
        /**
         * @ORM\ManyToOne(targetEntity="AKH\RootBundle\Entity\Vehicule", inversedBy="utilisateurs")
         * @ORM\JoinColumn(name="num_util", referencedColumnName="num_util")
         */
        private $vehicule;
     
        /**
         * @return mixed
         */
        public function getVehicule()
        {
            return $this->vehicule;
        }
     
        /**
         * @param mixed $vehicule
         */
        public function setVehicule(Vehicule $vehicule = null)
        {
            $this->vehicule = $vehicule;
        }
     
    }
    Entité vehicule :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
     
    <?php
     
    namespace AKH\RootBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Vehicule
     *
     * @ORM\Table(name="vehicule")
     * @ORM\Entity
     */
    class Vehicule
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="num_vehicule", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $numVehicule;
     
        /**
         * @ORM\OneToMany(targetEntity="AKH\RootBundle\Entity\Utilisateur", mappedBy="vehicule")
         * @ORM\JoinColumn(name="num_util", referencedColumnName="num_util")
         */
        private $utilisateurs;
     
        /**
         * @return mixed
         */
        public function getUtilisateurs()
        {
            return $this->utilisateurs;
        }
     
        /**
         * @param mixed $utilisateurs
         */
        public function setUtilisateurs($utilisateurs)
        {
            $this->utilisateurs = $utilisateurs;
        }
     
       /**
         * @var integer
         *
         * @ORM\Column(name="num_util", type="integer")
         */
        private $numUtil;
     
        /**
         * @return int
         */
        public function getNumUtil()
        {
            return $this->numUtil;
        }
    Et ca ne marche pas j'ai une erreur :
    Missing value for primary key numVehicule on AKH\RootBundle\Entity\Vehicule

    Class Mapping errors
    AKH\RootBundle\Entity\Utilisateur
    The referenced column name 'num_util' has to be a primary key column on the target entity class 'AKH\RootBundle\Entity\Vehicule'.

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    janvier 2007
    Messages
    1 547
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 547
    Points : 2 312
    Points
    2 312
    Par défaut
    Tes annotations ne sont pas bonne.
    Voir
    http://docs.doctrine-project.org/pro...nref-jointable
    http://symfony.com/doc/current/doctr...pping-metadata

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @ORM\JoinColumn(name="num_util", referencedColumnName="num_util")
    Dans "name" tu dois renseigner le nom de la colonne dans la table utilisateur qui sert de clé étrangère.
    Tu a remis "num_util" qui est le nom du champ pour l'identifiant de tes utilisateurs.

    Dans "referencedColumnName" il faut mettre le nom de la propriété dans véhicule qui sert à faire la jointure inverse par exemple "utilisateurs".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /**
     * @ORM\ManyToOne(targetEntity="AKH\RootBundle\Entity\Vehicule", inversedBy="utilisateurs")
     * @ORM\JoinColumn(name="nom_du_champ_dans_ta_bdd", referencedColumnName="utilisateurs")
     */
    private $vehicule;
    Du coup dans véhicule tu dois mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
     * @ORM\OneToMany(targetEntity="AKH\RootBundle\Entity\Utilisateur", mappedBy="vehicule")
     */
    private $utilisateurs;
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    octobre 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2003
    Messages : 159
    Points : 84
    Points
    84
    Par défaut
    Merci pour ton aide, c'est sympa d'avoir pris sur ton temps.

    J'ai réussi a trouver la solution.

    J'avais 2 autres problèmes qui faisait que ca ne marchait pas.
    Certaines mises a jour de mon orm vers ma base de données n'était pas vraiment appliqué, notamment les clés étrangeres, cétait parce que j avais des tables en myisam au lieu de table au format innodb.
    Ensuite le type vehicule je devais lui creer un "vehiculetype" associé pour pouvoir ensuite y accéder via form.vehicule.mavariable dans twig.

    Trés content de pouvoir passer a autre chose.

    Merci !

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 28/06/2013, 10h23
  2. [MLD] Relier des modes de communication à plusieurs entités
    Par khyor dans le forum Schéma
    Réponses: 4
    Dernier message: 05/05/2010, 17h50
  3. Réponses: 2
    Dernier message: 18/02/2010, 14h57
  4. relier des tables d'une manière efficasse
    Par dimebagplan dans le forum Schéma
    Réponses: 4
    Dernier message: 22/12/2008, 21h48
  5. Réponses: 1
    Dernier message: 11/01/2007, 23h57

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