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 :

Structuration inhabituelle des entités dans un projet Symfony


Sujet :

Doctrine2 PHP

  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut Structuration inhabituelle des entités dans un projet Symfony
    Bonjour, Je m'initie à Symfony2 (venant tout droit de Symfony1.4) et je demande des idées pour réaliser une chose un peu hors du commun. J'ai par exemple les entités Personne, Localite, Evenement. A ces entités je dois ajouter des numéros de téléphone, des photos, etc.
    La première idée est d'avoir des Personne_photo, Personne_phone, Localite_photo, Localite_phone, Evenement_photo, Evenement_phone. Mais cette solution va me faire répéter trop de code, puisque que dans chaque contrôleur je dois écrire l'action pour récupérer les photos, les numéros de téléphone de chaque objet de l'entité en question. En plus je préfère rassembler toutes les photos dans une seule table quelle que soit l'entité à laquelle elle est rattachée, et pouvoir ainsi faire une galerie photos. Aussi j'ai pensé avoir plutôt des table entite_photo, entite_phone, avec dans chacune d'elle les champs entite_nom et entite_object_id. Le champ entite_nom va stocker le nom de l'entité (exemple: personne, evenement ou localite). Entite_object_id est une clé étrangère qui référencera l'object de l'entité auquel appartient la photo ou le numéro de téléphone. (J'ai constaté que c'est la même méthode qui est utilisée pour le système de traduction par défaut dans symfony2. Il se crée dans la base de donnée une table ext_translations qui contient un champ object_class de type VARCHAR qui enregistre les noms des entités dont les objets sont traduits, et un champ foreign_key, VARCHAR lui aussi bizarrement, qui contient les id des objets traduits.)
    Mon problème est que je ne sais pas comment réussir à faire en sorte que, lors de la création ou de l'édition d'un objet de base (Personne, Localite, Evenement), je puisse ajouter dynamiquement plusieurs champs photo et téléphone) et persister en même temps dans la table de base et les tables associées (Exemple: personne, personne_photo et personne_phone). Merci de vos réponses.

  2. #2
    Membre éclairé Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 320
    Par défaut
    Salut,

    Je ne comprends pas vraiment la construction de ton appli.
    Qu'appels tu évènements et que cela comporte.

    Ensuite, je ne comprends pas certaines relations . En effet, pourquoi une localité est en relation avec phone? Idem avec evenements.

    Une ville n'a pas de téléphone. Un évènement aussi?

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    Sisi, une ville a une municipalité qui a de téléphone. Mais bon, pour se concentrer sur l'aspect technique de la chose, j'ai mis en pièce jointe une image de ce que j'aimerais voir en base de donnée à la fin. J'ajoute que je veux me baser sur l'exemple de la table ext_translations qui se crée avec l'extension Translatable (avec StofDoctrineExtensionBundle).
    Images attachées Images attachées   

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2009
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2009
    Messages : 126
    Par défaut
    Citation Envoyé par etoileweb Voir le message
    J'ai par exemple les entités Personne, Localite, Evenement. A ces entités je dois ajouter des numéros de téléphone, des photos, etc.
    Fais une table 'medias' (chemin, extension, poids ...) et
    'informations' (tel, adresse ...)

    Citation Envoyé par etoileweb Voir le message
    La première idée est d'avoir des Personne_photo, Personne_phone, Localite_photo, Localite_phone, Evenement_photo, Evenement_phone. Mais cette solution va me faire répéter trop de code, puisque que dans chaque contrôleur je dois écrire l'action pour récupérer les photos, les numéros de téléphone de chaque objet de l'entité en question.
    Le schéma n'est pas si complexe, la recupération dans les controleurs non plus :

    localite n<->n medias
    localite n<->n informations
    evenement n<->n medias
    evenement n<-> n informations

    Si tu veux alléger tes controlleurs, passes par la création de services dédiés pour gérer ta gallerie média par exemple

    Citation Envoyé par etoileweb Voir le message
    En plus je préfère rassembler toutes les photos dans une seule table quelle que soit l'entité à laquelle elle est rattachée, et pouvoir ainsi faire une galerie photos.
    Avec l'entité média c'est facile

    Citation Envoyé par etoileweb Voir le message
    Aussi j'ai pensé avoir plutôt des table entite_photo, entite_phone, avec dans chacune d'elle les champs entite_nom et entite_object_id. Le champ entite_nom va stocker le nom de l'entité (exemple: personne, evenement ou localite). Entite_object_id est une clé étrangère qui référencera l'object de l'entité auquel appartient la photo ou le numéro de téléphone. (J'ai constaté que c'est la même méthode qui est utilisée pour le système de traduction par défaut dans symfony2. Il se crée dans la base de donnée une table ext_translations qui contient un champ object_class de type VARCHAR qui enregistre les noms des entités dont les objets sont traduits, et un champ foreign_key, VARCHAR lui aussi bizarrement, qui contient les id des objets traduits.)
    Là tu vas réécrire StofDoctrineExtensionsBundle

  5. #5
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 260
    Par défaut
    Merci pour le tuyau.
    Le schéma n'est pas si complexe, la recupération dans les controleurs non plus :

    localite n<->n medias
    localite n<->n informations
    evenement n<->n medias
    evenement n<-> n informations
    Cela écarte bien sûr ma crainte d'avoir, avec des relations 1:n, des champs localite_id, evenement_id, personne_id... à n'en point finir dans dans les tables media et information, mais ca m'oblige à des associations n:n. J'aurais bien aimer utiliser le One-To-Many, Unidirectional with Join Table mais je veux absolument des relations bidirectionnelles. En tout cas merci, je continuerai de creuser.

Discussions similaires

  1. Gestion des formulaires dans un projet adp
    Par Jertho dans le forum Modélisation
    Réponses: 1
    Dernier message: 05/10/2009, 15h11
  2. Où disposer les entités dans un projet Entreprise ?
    Par balmeyer dans le forum Persistance des données
    Réponses: 3
    Dernier message: 11/09/2007, 13h54
  3. faire des calculs dans un projet Windows
    Par rbell dans le forum Windows
    Réponses: 2
    Dernier message: 06/09/2007, 19h28
  4. [Débutant] inclure des .class dans le projet
    Par chadliii dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 16/02/2007, 00h01
  5. Réponses: 3
    Dernier message: 16/02/2006, 14h49

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