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 :

Entité avec nom de table dynamique


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut Entité avec nom de table dynamique
    Bonjour,

    Le problème est le suivant : comment peut on définir un nom de table de façon dynamique pour une entité ?

    Au niveau de ma base de données j'ai des tables qui ressemble à ceci :

    table_1_elec;
    table_1_temp;
    table_1_plug;

    table_2_elec;
    table_2_temp;
    table_2_plug;

    ainsi de suite...

    Le principe serait de récupérer l'identifiant de l'utilisateur connecté pour ainsi générer le nom des tables des 3 entitées elec, temp et plug?

    J'ai regardé du coté de la doc de doctrine sql-table-prefixes mais je ne voie pas comment l'adapter à mon cas !!

    Merci d'avance

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 506
    Par défaut
    Bonjour,

    Je ne connais pas bien Doctrine, mais j'imagine qu'il est possible de lui dire avec quelle table travailler dans ton fichier entity.

    Un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      public function __construct()
        {
            $this->name = $NomDeTablePasserEnPArametreDeSessionParExemple;
            $this->id = 'idDeLaTable'
        }

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut
    Justement, avec cette solution, ce n'est qu'au moment de l'utilisation de l'entité que c'est possible et je ne dispose pas des jointures et tout le reste, de ce que j'ai compris il faut joué avec le loadMetaData, mais je ne vois pas comment l'implémenter..

  4. #4
    Membre éclairé

    Inscrit en
    Novembre 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 425
    Par défaut
    J'ai déjà eu l'occasion de jouer avec les métadatas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            $entityManager = $this->container->get('doctrine')->getManager();
            $class = $entityManager->getClassMetadata("$bundle:$entityName"); // Ici, tu peux construire ton nom d'entité...
    Après, on peut jouer avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            $pk = $classMetadata->getIdentifierFieldNames(); // Récupération des champs de la PK
            foreach ($classMetadata->getFieldNames() as $num=>$fieldname)
            {
                    $type = $classMetadata->getTypeOfField($fieldname);
                    ...
            }

  5. #5
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut
    Citation Envoyé par fatbob Voir le message
    J'ai déjà eu l'occasion de jouer avec les métadatas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            $entityManager = $this->container->get('doctrine')->getManager();
            $class = $entityManager->getClassMetadata("$bundle:$entityName"); // Ici, tu peux construire ton nom d'entité...
    Après, on peut jouer avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            $pk = $classMetadata->getIdentifierFieldNames(); // Récupération des champs de la PK
            foreach ($classMetadata->getFieldNames() as $num=>$fieldname)
            {
                    $type = $classMetadata->getTypeOfField($fieldname);
                    ...
            }
    Yes merci fatbob.
    Je suis en train de tester ta solution avec un listener sur le login pour mettre à jour le nom de ma table dès la connexion au lieu de le faire sur chaque appel de l'entité.

  6. #6
    Membre très actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 122
    Par défaut
    J'avance, j'avance

    @fatbob ton mini bout de code m'a inspiré, donc au lieux de définir le nom de la table au moment de l'appel de l'entité je le fait au login, comme ça c'est fait une seule fois.

    Donc j'ai fait un listener sur le login :

    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
    <?php
     
    namespace DD\MyBundle\Listener;
     
    use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
    use Symfony\Component\Security\Core\SecurityContext;
    use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine; // for Symfony 2.1.0+
     
    // use Symfony\Bundle\DoctrineBundle\Registry as Doctrine; // for Symfony 2.0.x
     
    /**
     * Custom login listener.
     */
    class LoginListener {
     
        /** @var \Symfony\Component\Security\Core\SecurityContext */
        private $securityContext;
     
        /** @var \Doctrine\ORM\EntityManager */
        private $em;
     
        /**
         * Constructor
         * 
         * @param SecurityContext $securityContext
         * @param Doctrine        $doctrine
         */
        public function __construct(SecurityContext $securityContext, Doctrine $doctrine) {
            $this->securityContext = $securityContext;
            $this->em = $doctrine->getEntityManager();
        }
     
        /**
         * Do the magic.
         * 
         * @param InteractiveLoginEvent $event
         */
        public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {
            if ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
                var_dump('IS_AUTHENTICATED_FULLY');
            }
     
            if ($this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
                var_dump('IS_AUTHENTICATED_REMEMBERED');
            }
     
            // do some other magic here
            $user = $event->getAuthenticationToken()->getUser();
     
            $classMetadata = $this->em->getClassMetadata('DDMyBundle:SiteElec');
            foreach ($classMetadata->getFieldNames() as $num => $fieldname) {
                $fieldtype = $classMetadata->getTypeOfField($fieldname);
                $tableName = $classMetadata->getTableName();
                echo('<pre>');
                print_r($classMetadata);die;
            }
        }
     
    }
    Avec ce petit listener j'ai modifié ma config de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    login_listener:
            class:  DD\MyBundle\Listener\LoginListener
            arguments: ['@security.context', '@doctrine']
            tags:
                - { name: 'kernel.event_listener', event: 'security.interactive_login' }
    Je bagote encore un peu mais je sens que je tiens le bon bout, par contre je me demande ce qui va se passer pour un utilisateur qui a récupère ses cookies, vais-je passer dans mon listener ? je vais tester.

Discussions similaires

  1. Create Table avec PRO*C avec nom de table dynamique
    Par laurent_56 dans le forum Oracle
    Réponses: 6
    Dernier message: 01/12/2011, 18h08
  2. Requête SQL dynamique avec nom de table dans une variable
    Par jonjack dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 15/09/2011, 14h37
  3. [PDO] ma requête n'est pas executé avec un nom de table dynamique
    Par Alexdezark dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/03/2010, 20h34
  4. Création de table avec nom de colonne dynamique
    Par jibileg dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/12/2007, 22h13
  5. Select avec nom de table dynamique
    Par boutss dans le forum SQL
    Réponses: 6
    Dernier message: 31/01/2007, 09h51

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