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 :

Clé primaire sur plusieurs colonnes


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut Clé primaire sur plusieurs colonnes
    Bonjour,
    Je voudrai créer une application dont la base de données ressemble à ça :
    (mes cours de Merise sont loin, soyez indulgents svp)

    J'aimerai donc créer mes entités suivant ce schéma.
    Ce qui implique, pour les tables etre_present et etre_absent, d'avoir comme clé primaire : personnel, date_debut et date_fin.
    Voici mon entité etre_present (que j'ai renommé en Presence pour coder plus facilement) :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    <?php
     
    namespace EME\GestionPlanningBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert; 
     
    /**
     * EME\GestionPlanningBundle\Entity\Presence
     *
     * @ORM\Table(name="etre_present")
     * @ORM\Entity(repositoryClass="EME\GestionPlanningBundle\Entity\PresenceRepository")
     */
    class Presence
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var integer $personnel
         *
         * @ORM\Column(name="personnel", type="integer")
         * @ORM\ManyToOne(targetEntity="EME\GestionPlanningBundle\Entity\Personnel")
         */
        private $personnel;
     
        /**
         * @var datetime $dateDebut
         *
         * @ORM\Column(name="date_debut", type="datetime")
         */
        private $dateDebut;
     
        /**
         * @var datetime $dateFin
         *
         * @ORM\Column(name="date_fin", type="datetime")
         */
        private $dateFin;
     
     
        /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
     
        /**
         * Set personnel
         *
         * @param integer $personnel
         */
        public function setPersonnel($personnel)
        {
            $this->personnel = $personnel;
        }
     
        /**
         * Get personnel
         *
         * @return integer 
         */
        public function getPersonnel()
        {
            return $this->personnel;
        }
     
        /**
         * Set dateDebut
         *
         * @param datetime $dateDebut
         */
        public function setDateDebut($dateDebut)
        {
            $this->dateDebut = $dateDebut;
        }
     
        /**
         * Get dateDebut
         *
         * @return datetime 
         */
        public function getDateDebut()
        {
            return $this->dateDebut;
        }
     
        /**
         * Set dateFin
         *
         * @param datetime $dateFin
         */
        public function setDateFin($dateFin)
        {
            $this->dateFin = $dateFin;
        }
     
        /**
         * Get dateFin
         *
         * @return datetime 
         */
        public function getDateFin()
        {
            return $this->dateFin;
        }
    }
    Le code d'etre_absent est presque identique : la seule différence réside dans l'ajout de la colonne contenant le lien vers categorie_absence.

    Comment puis-je créer ce genre de clé primaire ?

    Merci d'avance
    Images attachées Images attachées  

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,
    Les clés composés sont supportés par Doctrine:
    http://www.doctrine-project.org/docs...mary-keys.html
    Il faut considérer ton association comme un composant de la clé et ne pas mettre de champ id.

    Cependant tu vas rencontrer des difficultés:
    Déja je suis pas sur que l'on puisse utiliser une date comme clé(J'ai tenté de mettre un champ date comme clé primaire seul et ça plante,en tant que composé je n'ai pas essayé).
    Ca complique l'utilisation de l'entity manager lorsque tu veux retrouver une entité (surtout avec 4 clés, dont certaines sont des entités).
    Tu ne peux pas utiliser le code generator (car pas de champ id).

    Bref, les bonnes pratiques dans le domaine des bases de données relationnelles ne se retrouve pas systématiquement dans Doctrine et il faut être pragmatique.
    Je pense que tu t'en sortiras mieux avec le code de la classe Presence que tu as présenté.

    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
     
    //exemple non testé de classe avec identifiant composé
    class Presence
    {
        /**
         * @var Personnel $personnel
         * @ORM\Id
         * @ORM\Column(name="personnel", type="integer")
         * @ORM\ManyToOne(targetEntity="EME\GestionPlanningBundle\Entity\Personnel")
         */
        private $personnel; 
        /**
         * @var datetime $dateDebut
         * @ORM\Id
         * @ORM\Column(name="date_debut", type="datetime")
         */
        private $dateDebut; 
        /**
         * @var datetime $dateFin
         * @ORM\Id
         * @ORM\Column(name="date_fin", type="datetime")
         */
        private $dateFin;

  3. #3
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Merci pour ta réponse.
    J'avais déjà pu constater que, pour reprendre tes termes, les bonnes pratiques de la base de données relationnelle ne sont pas toujours reprises dans Doctrine mais je ne m'attendais pas à ce que ça soit à ce point-là.

    Ton conseil est donc de rester avec ce que j'ai actuellement et de gérer l'unicité de mes trios personnel, date_debut et date_fin en PHP dans le repository si je comprends bien ?

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Oui je pencherai pour les entités suivantes (tant en Doctrine qu'en Merise, d'ailleurs):

    Personnel (id,nom,prenom, hasMany Abscence,hasManyPresence)
    Absence (id, date debut , date fin , hasOne Personnel, hasOne CategoryAbsence)
    Presence (id, date debut , date fin , hasOne Personnel)
    CategoryAbsence(id,libelle)

    Par ailleurs je ne vois pas trop ce que gérerais une clé composé de date dans absence et présence. tu as plutôt besoin de savoir si la période d'une absence est déjà comprise dans une autre absence.
    Avec ou sans Doctrine et des clés composés tu peux donc avoir dans ta table absence
    - employé toto absent du 1er janvier au 31 janvier
    - employé toto absent du 5 janvier au 15 janvier
    et dans ta table Presence
    - employé toto présent du 2 janvier au 13 janvier

    Donc au final si l'on souhaitait un controle au niveau de la base de données, il te faudrait sans doute des triggers, ce qui est également une béquille par rapport à un modèle conceptuel des données.

    En fait je comprend pas trop ton MCD soit tu gères des jours de présence sois des périodes de présence. D'autre part une absence c'est généralement l'inverse d'une présence alors ça parait un peu redondant...

  5. #5
    Membre éclairé Avatar de magicbisous-nours
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Par défaut
    Merci beaucoup pour ton aide.

    Pour répondre à ton interrogation sur la redondance de gérer des présences et des absences c'est qu'il est demandé à ce que l'utilisateur puisse placer les présences des personnes quand il veut. Le nombre de personnes effectivement présentes varie en fonction de certains paramètres (qui ne sont pas gérés par l'application).
    Ce qui fait qu'une personne peut être soit présente (l'utilisateur - généralement son supérieur - l'a attribué sur cette période), soit pas présente (l'utilisateur ne l'a pas attribué sur cette période, ce qui fait qu'en cas d'absence d'un(e) collègue elle peut être appelée) soit absente (et donc pas appelable).

Discussions similaires

  1. [MariaDB] Clé étrangère avec une clé primaire sur plusieurs colonnes
    Par Steph258 dans le forum Administration
    Réponses: 2
    Dernier message: 03/03/2014, 09h19
  2. Réponses: 2
    Dernier message: 15/06/2011, 14h10
  3. Réponses: 5
    Dernier message: 29/09/2005, 09h35
  4. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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