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

PHP & Base de données Discussion :

[Doctrine] définir un élement d'une table associative


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut [Doctrine] définir un élement d'une table associative
    bonjour,

    dans ma bdd j'ai une table gpUser et gpModule qui sont lié en relation many to many dans la table associative (gp_dtAcces) de ces deux tables j'ai un champ numdTacces qui me permet de définir les d'acces d'un utilisateur à un module.
    ma table gpmodule
    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
     
    public function setTableDefinition()
        {
            $this->setTableName('gp_module');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'autoincrement' => true,
                 'length' => '4',
                 ));
     
     $this->hasMany('GpUser', array(
                    'local' => 'GPModule_id',
                    'foreign' => 'GPUser_id',
                    'refClass' => 'GpDtacces'));
    ma table gpuser
    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
     
     public function setTableDefinition()
        {
            $this->setTableName('gp_user');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'autoincrement' => true,
                 'length' => '4',
                 ));
    ...
    $this->hasMany('GpModule', array(
                    'local' => 'GPUser_id',
                    'foreign' => 'GPModule_id',
                    'refClass' => 'GpDtacces'));
    ma table associative.
    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
     
    public function setTableDefinition()
        {
            $this->setTableName('gp_dtAcces');
            $this->hasColumn('GPUser_id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'autoincrement' => false,
                 'length' => '4',
                 ));
            $this->hasColumn('GPModule_id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'autoincrement' => false,
                 'length' => '4',
                 ));
            $this->hasColumn('numDtAcces', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => false,
                 'notnull' => true,
                 'autoincrement' => false,
                 'length' => '4',
                 ));
        }

    ma question étant dans doctrine comment fait on pour définir les droits d'accès d'un user à un module depuis un user par exemple ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    en réponse à moi même,

    -il est possible de créer un lien entre la table GPuser et GPmodule comme suit
    $user=new user()
    $user->gpmodule[0]->GpmoduleName="toto"

    le lien est bien créé dans la table associative gpDtAcces mais numDtAcces n'est pas renseigné et depuis user il est impossible de le définir.

    du cou il faut

    créer l'objet user et l'enregistrer via save
    $user=new GPuser()
    $user->nomChamp=...
    $user->save()

    creer l'objet moduler et l'enregistrer via save
    $module=new GPmodule()
    $module->nomchamp=...
    $module->save

    creer l'objet de la table associative et affecter l'objet user à gpuser_id et affecter l'objet gpmodule à gpmodule_id et enfin définir le numDtAcces correspondant.

  3. #3
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne sais pas écrire ta définition de table en mode objet, je pourrais y arriver, mais pas trop de le temps de faire les recherches de correspondances.

    Par contre, je sais le faire en yaml....

    Tes tables et leurs relations en yaml.
    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
     
    GPModule
      tablename: gp_module
      columns:
        id:
          type: integer
          primary: true
          autoincrement: true
        ...
     
    GPUser
      tablename: gp_user
      columns
        id:
          type: integer
          primary: true
          autoincrement: true
      relations:
        GPModules:
          class: GPModule
          refClass: GPDtAccess
          foreignAlias: BPUsers
     
    GPDtAccess
      tablename: gp_dtAccess
      columns:
        GPUser_id: 
          type: integer
          primary: true
        GPModule:
          type: integer
          primary: true
        num_dtAcess: integer(4)
      relations:
        GPUser:
          local: GPUser_id
          foreign: id
          foreignAlias: GPDtAccesss
        GPModule:
          local: GPModule_id
          foreign: id
          foreignAlias: GPDtAccesss
    Par contre, Doctrine ne gère pas bien les relations n-n avec un attribut dans la liaison. En fait, c'est l'accès à l'attribut qui est difficile. Il faut alors considérer la liaison n-n comme deux liaisons, une n-1 et une 1-n.

    Autre chose, le nom d'une table ne devrait, dans l'idéal, jamais ce terminer par un "s" au singulier, encore moins deux "s". Ceci est lié aux noms des relations, en effet, une relation qui se termine par un s indique qu'elle retourne un Doctrine_Collection et non pas un Doctrine_Record unique. D'où les trois "s" dans la liaison avec la table Access, les deux d'origines, plus le s de convention... Personnellement, je changerais Access en autre chose.

    Avec cela tu peux, depuis un record $user, récupérer tous les modules par :
    $user->getModules() qui te retourne une collection des modules.

    Pour créer une liaison entre un module $module et un user que tu viens de créer ($NewUser), tu n'as qu'a lui dire :
    $module->setUsers($NewUser)
    tu peux aussi y mettre un array.
    Normalement, la liaison est ajouté et non remplacente, mais je suis pris d'un méchant doute.

    Pour passer par la table intermédiaire, il faut créer ton user, ton module (ou en récupérer un objet record, puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $NewAccess = new GPDtAccess;
    $NewAccess->setUser($user)
             ->setModule($module)
             ->setNumDtAccess(3)
             ->save();
    C'est un peu plus lourd à cause de la gestion de l'argument numDtAccess.

    Il faut peut-être prévoir une gestion des effacements en série.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    la classe,

    merci d'avoir pris le temps de me répondre

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

Discussions similaires

  1. Ajout de données à une table associative
    Par Cyriusix dans le forum IHM
    Réponses: 0
    Dernier message: 21/05/2008, 16h20
  2. Réponses: 12
    Dernier message: 09/05/2008, 08h32
  3. Table de vérité et remplissage d'une table associée
    Par Frog74 dans le forum VBA Access
    Réponses: 9
    Dernier message: 07/05/2008, 14h21
  4. Recherche de donnee dans une table associée
    Par josoft dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2003, 15h22
  5. Recherche de donnee dans une table associée
    Par josoft dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 14/07/2003, 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