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 :

Meilleure façon de modéliser ce problème [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut Meilleure façon de modéliser ce problème
    Bonjour,

    j'ai une application qui est basée sur des utilisateurs et des jouets. Les utilisateurs peuvent avoir plusieurs jouets, et un jouet peut être possédé par plusieurs utilisateurs, avec trois statuts (j'aime le jouet, je n'aime pas le jouet, je souhaite le jouet)

    Donc je simule la relation many-to-many avec attribut par des relations many-to-one :

    Utilisateur < Posséder ('statut') > Jouet

    Du coup dans mon modèle objet, j'ai mes utilisateurs et me jouets qui ont des tableaux d'entités Posseder.

    C'est très peu pratique pour récupérer les jouets d'un utilisateur par statut, de dire si un jouet à un statut particulier pour un utilisateur, ou pour changer le statut (car il faut voir si l'utilisateur le possède pour changer l'entité ou la créer si elle n'existe pas).

    Et si j'ai une page de jouets et que je dois tester leur statut vis à vis de l'utilisateur pour adapter les options (ajouter, changer statut, etc.), je fais comment sans générer une requete par jouet ?

    Je me dis que je dois rater quelque chose, car on ne manipule que des entités Posséder pratiquement, on a peu de façon de lier facilement un utilisateur à un jouet et inversement. Ca génère pas mal de requêtes.

    Du coup je m'interroge, est-ce que je loupe quelque chose et y a t-il un moyen facile de gérer ce genre de situation ?
    Je m'oriente vers un service qui gérerait les possessions, et qui remplirait un tableau associatif chez l'utilisateur ($possessions['clef=statut']), et par qui on passerait pour ajouter une possession ou changer un statut.
    Mais du coup je me passe des services implicitent de symfony (evenements, etc), donc je me demande s'il n'y a pas de meilleures solutions



    Merci de m'avoir lu !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Par défaut
    Bonjour,

    Je n'ai pas forcément bien saisi ce que tu souhaites faire donc désolé si je suis à côté de la plaque.

    on a peu de façon de lier facilement un utilisateur à un jouet
    et inversement.
    Ton entité "Posséder" (j'éviterais les voyelles accentuées à ta place) dispose d'une clé étrangère pour les utilisateurs et d'une autre pour les jouets. Il me parait difficile de faire plus simple pour lier les deux.

    Et si j'ai une page de jouets et que je dois tester leur statut vis à vis de l'utilisateur pour adapter les options (ajouter, changer statut, etc.), je fais comment sans générer une requete par jouet ?
    Une seule requête va suffire. A priori, ton utilisateur est identifié et tu connais les jouets que tu affiches, tu as donc les deux clauses dont tu as besoin pour ne réaliser qu'une seule requête.

    Vu la façon dont tu poses la question, je crois qu'il faut que tu regardes du côté de cette écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $q->andWhere('p.jouet IN (:ids)')
          ->setParameter('ids', $ids);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Merci de te pencher sur mon cas,

    mon problème est que le tableau de Posséder qu'il y a dans mes utilisateurs ou mes jouets sont assez inutiles pour moi, car il ne me permettent pas facilement de savoir si un utilisateur possède un jouet et vice versa,

    Pour mon problème de requêtes trop importantes, c'est dans le cas ou par exemple j'affiche un catalogue de jouets (donc tous les jouets sont affichés indépendamment de leur possession ou statut vis à vis de l'utilisateur), et donc j'ai besoin de savoir pour chaque jouet s'il est possédé par l'utilisateur et selon quel statut. Donc il me semble qu'il faut que l'info soit du côté de l'utilisateur (ou d'un service, mais il faut quand même faire une requête supplémentaire pour chaque page comportant un ou plusieurs jouets).

    Prenons cet exemple tiens, j'ai une action de controller qui affiche tous les objets du catalogue, et dans mon template j'affiche ces jouets, avec à côté les possibilités pour chaque jouet (par exemple l'utilisateur peut dire qu'il souhaite un jouet seulement s'il ne le possède pas)

    Je ne vois pas comment gérer ce cas élégamment ...

    Le meilleur cas que je vois, c'est un service appelé dans le controller et qui renvoie des tableaux d'id (un par statut), que je passe au template, et dans le template je teste pour chaque jouet si l'id est dans un des tableaux pour avoir son statut vis à vis de l'utilisateur pour savoir quoi proposer.

    Ou ajouter un attribut status dans l'entité Jouet, et remplir ce champs dans le repository du jouet lors de mes requêtes, en hydratant l'objet à la main ?

    Bref ça me parait bien compliqué, doit avoir plus simple mais je ne vois pas ...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Par défaut
    Est-ce que tu peux poster tes deux entités, ça sera plus simple je pense avec un peu de code plutôt qu'avec des phrases.
    En gros, je pense qu'avec les jointures adéquates, ton entité posséder est suffisante pour ce que tu veux faire.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 7
    Par défaut
    Salut,

    oui en fait la solution est dans la jointure,

    en remplaçant les appels standards dans mes repository par des méthodes qui font une jointure (leftJoin) entre Jouet et Posséder avec une condition sur l'auteur, ça marche, j'obtiens des Jouets avec 0 ou 1 entités Posséder dans le tableau, donc je peux facilement faire mes tests

    ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $qb->leftJoin('c.ownings', 'o', 'WITH', 'o.user = :user')
    		->setParameter('user', $user);
    Après il faudra que je regarde ce que ça fait lorsque je supprime ou modifie ce tableau de Posséder qui est partiel, et que je persiste en BDD.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Par défaut
    C'est là que je voulais en venir

    Pour les modifications et les suppressions, ne te fais pas de noeud au cerveau. Il te suffira d'instancier l'objet Posséder que tu souhaites modifier/supprimer (tu as son id dans le résultat de ta requête) et d'y appliquer la méthode idoine.

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

Discussions similaires

  1. Meilleur façon de résoudre le problème du sac à dos
    Par K-you dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 01/11/2010, 18h36
  2. Réponses: 9
    Dernier message: 27/03/2006, 19h05
  3. Réponses: 7
    Dernier message: 24/02/2006, 16h31
  4. Liste d'objets, quel est la meilleure façon
    Par shirya dans le forum C++
    Réponses: 2
    Dernier message: 08/12/2005, 16h59
  5. Est ce bien la meilleure façon de faire un histogramme ?
    Par rvzip64 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 10/05/2005, 12h41

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