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 :

Plusieurs entités pour une même table


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut Plusieurs entités pour une même table
    Hello

    Comme dit dans le titre, j'aimerai mettre en place plusieurs entités dont les attributs sont dans une même table

    Par exemple, j'ai ma classe "employe" : nom, prenom...
    et je voudrai créer une autre classe "candidat" qui aurait les mes attributs qu' employé plus d'autres (date de candidature..)

    J'avais trouvé Inheritance de doctrine

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="classname", type="string")
     * @ORM\DiscriminatorMap({"employe" = "employe", "candidat" = "Candidat"})
    J'ai bien une table pour mes entités, mais doctrine ajoute une clause automatique where class_name in ('employe', 'candidature')
    ce qui est logique, mais je n'arrive pas à forcer cette clause
    si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $qb->andWhere('e.class_name = :class')
                        ->setParameter('class', "employe");
    J'ai l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Entity\Employe has no field or association named class_name
    pourtant dans ma table ce champ existe bien
    et j'ai même créer dans mon entity un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    protected $class_name;
     
        public function getClassName()
        {
            return $this->class_name;
        }
    mais ca va pas mieux

    Comment faire ?

    Et est ce la bonne méthode dans mon cas en utilisant l'inheritance ?

    J'ai essayé en passant par une class abstract mais d'office j'ai plussieurs table qui se crée

    Merci

  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,

    la colonne discriminante n'est pas mappé par Doctrine, donc pas utilisable en DQL.

    tu peux
    - appeler le repository de la classe hérité ou faire du DQL sans Query Builder
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $em->getRepository('Employee')->createQueryBuilder()->getQuery()->getResult();
     
    $em->createQuery('SELECT e FROM Employee e')->getResult();
    - utiliser le mot clé "instanceof" dans tes requetes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $em->createQuery("SELECT p FROM Person p WHERE p INSTANCE OF Employee")->getResult();
    http://doctrine-orm.readthedocs.org/...-language.html

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2003
    Messages
    307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Février 2003
    Messages : 307
    Par défaut Passer d'une classe à l'autre
    Pour finir j'ai choisi la solution de passer par une classe intermédiaire abstraite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /**
     * @ORM\Entity
     * @ORM\MappedSuperclass() 
     * @ORM\Table(name="employe")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="class_name", type="string")
     * @ORM\DiscriminatorMap( {"employe" = "Employe", "candidature" = "Candidature"} ) 
     * 
     */
     
    Abstract class Person {
    ...
    }
    Ainsi quand je fais appel au repository, doctrine se charge d'indiquer la bonne classe dans class_name

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $entity = $em->getRepository('GrhBundle:Candidature')->find($id);
    $entity = $em->getRepository('GrhBundle:Employe')->find($id);
    Super :-)

    Maintenant je suis confronté à un autre problème
    Je désire qu'un candidat devienne employé
    Il suffit que je change la valeur de class_name dans la bd "candidature" en "employe"
    Si je le fais dans phpmyadmin ca fonctionne

    Mais si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if ($statut == 'Actif') {
                    $entity->setClassName('employe');
                }
                $t = $entity->getClassName();
                var_dump($t);
                $em->flush();       
                $t = $entity->getClassName();
                var_dump($t);
    le $t me retourne bien la valeur "employe", sauf que je ne sais pas à quelle moment cette valeur redevient "candidature" !

    Doctrine force quelque part...

    Je désire garder le même ID de l'object,

    Comment faire

Discussions similaires

  1. [2.x] Plusieurs entités pour une même table doctrine
    Par JackStrieger dans le forum Symfony
    Réponses: 0
    Dernier message: 15/01/2014, 14h47
  2. Max pour plusieurs éléments dans une même table
    Par Schwy dans le forum Requêtes
    Réponses: 12
    Dernier message: 07/10/2013, 18h17
  3. [2.x] Plusieurs entités pour une seule table
    Par JackStrieger dans le forum Symfony
    Réponses: 7
    Dernier message: 03/09/2013, 23h24
  4. Réponses: 9
    Dernier message: 29/11/2012, 12h26
  5. Plusieurs entités pour une même relation
    Par Mandotnet dans le forum Schéma
    Réponses: 1
    Dernier message: 08/04/2007, 20h13

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