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 :

Table "tronc commun" (société, contact, etc.) et tables supplémentaires liées (contact_ami, contact_pro, etc.)


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Par défaut Table "tronc commun" (société, contact, etc.) et tables supplémentaires liées (contact_ami, contact_pro, etc.)
    Bonjour

    Je suis à la recherche de quelques conseils pour réaliser ceci : mon application doit gérer des sociétés de typologies différentes. Toutes les sociétés ont un tronc communs (champs nom, adresse, etc.) et chaque société à des champs spécifique à son type (nom commercial pour certains types et pas pour d'autres, etc.).

    L'idéal serait d'avoir une table "societe" qui regroupe les champs communs puis une table par type de société qui contient tous les champs spécifiques ("societe_type1, societe_type2...).

    Le but est de pouvoir récupérer tous les champs d'une société (le tronc commun + ses champs spécifiques).

    Je débute sous Symfony et je sèche un peu. Je penche pour :
    • avoir un champs dans le tronc commun qui m'indique le type de société (ex: "type1").
    • modifier la méthode find du repository pour qu'elle récupère d'abord le type afin de déterminer sur quelle table faire un JOIN puis, dans une seconde requête, récupérer le tronc commun JOIN la table spécifique.


    Je suppose que ça marche mais cela va faire deux requêtes pour récupérer un seul enregistrement (l'application devra effectuer des analyses statistiques fréquentes sur ces tables et c'est pour ça que si possible, j'aimerais éviter deux requêtes). Ce qui serait bien en fait, c'est de pouvoir déterminer dynamiquement le nom de la table à lier.

    Pensez-vous que cela reste la meilleure solution ? Une meilleure idée (code SQL/DQL qui ferait cela ou autre schéma...) ?

    Je pourrais aussi faire une classe entité contenant le tronc commun puis créer une nouvelle classe pour chaque typologie qui hériterait de ce tronc commun, mais cela va (forcément ?) me créer plusieurs tables, ce qui ne sera pas gérable.

    Au final, l'idée serait d'avoir mon formulaire de tronc commun avec une liste déroulante permettant de choisir le type de société. Lorsque je choisis un type, le formulaire spécifique au type s'affiche sous (ou mieux, s'intègre dans) le formulaire.

    J'utilise Doctrine. Et j'attends vos conseils avec impatience

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 104
    Par défaut
    Salut, c'est possible je l'ai fait en utilisant FosUserBundle pour des Utilisateurs de type société ou particulier.

    Ton tronc commun c'est en fait ton entité User héritant de FosUserBundle.
    Ensuite tu utilise l'héritage de table pour tes autres entités.

    Disons que tu as "Societe" qui est le tronc commun et deux type de société: Sarl et Sasu.

    Tu crée un bundle MyApp/UserBundle.
    Dans le dossier Entity tu mets:
    Societe.php
    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
     
    // MyApp/UserBundle/Entity/Societe.php
     
    namespace MyApp\UserBundle\Entity;
     
    use FOS\UserBundle\Entity\User as BaseUser;
    use Doctrine\ORM\Mapping as ORM;
     
     
    /**
     * @ORM\Entity
     * @ORM\Table(name="fos_user")
     * @ORM\InheritanceType("SINGLE_TABLE")
     * @ORM\DiscriminatorColumn(name="discr", type="string")
     * @ORM\DiscriminatorMap({"societe" = "Societe", "sarl" = "Sarl", "sasu" = "Sasu"})
     */
    class User extends BaseUser
    {
    /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
    //ensuite les propriétés communes à toute tes sociétés
     
    }
    Sarl.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // MyApp/UserBundle/Entity/Sarl.php
     
    namespace MyApp\UserBundle\Entity;
     
    use MyApp\UserBundle\Societe as BaseSociete;
    use Doctrine\ORM\Mapping as ORM;
     
    class Sarl extends BaseSociete
    {
        //tes propriétés spécifique aux Sarls 
    }
    Sasu.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // MyApp/UserBundle/Entity/Sasu.php
     
    namespace MyApp\UserBundle\Entity;
     
    use MyApp\UserBundle\Societe as BaseSociete;
    use Doctrine\ORM\Mapping as ORM;
     
    class Sasu extends BaseSociete
    {
        //tes propriétés spécifique aux Sasus 
    }
    Il faut bien savoir que Doctrine va te créer UNE seule table, ta table fos_user, qui va contenir une colonne type pour identifier ton type de société, donc si tu mets par exemple 10 propriétés spécifiques aux Sarl et 10 autres aux Sasu tu vas te retrouver avec les 20 propriétés dans la même table.

    Le mieux dans ce cas c'est de faire ensuite des entités ProfileSarl et ProfileSasu que tu mets en liaison respectivement avec les entités Sarl et Sasu. Ceci te permettra de réduire au minimum ta table Societe, ce qui évite d'avoir un élément Sarl avec 10 propriétés à NULL (celle de Sasu) et vice versa avec Sasu.

    mais cela va faire deux requêtes pour récupérer un seul enregistrement
    Maintenant avec cette méthode tu peux faire dans ton controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $em=$this->getDoctrine()->getEntityManager();
    $em->getRepository('MyAppUserBundle:Sarl')->getAllWithProfile();
    où tu méthode getAllWithProfile récupère ta Sarl avec un innerJoin sur ProfileSarl, donc une seule requête.

    Tu n'es pas obligé de le faire avec FosUserBundle, si par exemple tes sociétés ne sont pas des utilisateurs du site mais seulement des données rentrées par un admin. Dans ce cas pareil sauf que société n'hérite pas de FosUser.

    Un lien sur les héritages de table Doctrine2 http://www.doctrine-project.org/docs...e-mapping.html

    tu peux aussi utiliser JOINED à la place de SINGLE_TABLE après ça dépends de tes besoins.
    D'ailleurs si tu as des retours d'expérience d'autres méthodes, je suis preneur car j'ai implémenté ça moi même et donc j'aimerai bien avoir des retours.

    Good luck

  3. #3
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 54
    Par défaut
    Tout d'abord merci pour ta longue réponse illustrée d'exemples

    Je suis tombé sur le lien sur les inheritance mapping de Doctrine peu après avoir posté ma question sur ce forum. A vue de nez, le "Class Table Inheritance" m'a séduit, j'ai essayé de le mettre en place pour tester mais ça ne marchait pas comme prévu (il était tard...). Pour résumer, mes deux tables étaient bien créées (tronc commun + table spécifique) mais pas je n'avais pas d'id dans ma table spécifique qui permettrait de lier les deux tables.

    Je regarderais ta solution ce we puisqu'elle a l'air de marcher pour toi et je ferais un petit retour.

    Merci !

Discussions similaires

  1. [MySQL] Requête SQL selectionner l'id d'une table sans clef commune
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 36
    Dernier message: 03/02/2006, 09h27
  2. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

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