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 :

[Doctrine2] Modéliser les relations entre users


Sujet :

Doctrine2 PHP

  1. #1
    Membre à l'essai
    Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 17
    Points
    17
    Par défaut [Doctrine2] Modéliser les relations entre users
    Bonsoir à tous,

    vous vous en doutez, si je poste c'est que j'ai un petit souci... Je suis en pleine découverte de Symfony2 et je bloque sur un point qui me semblait assez simple avant de passer sur Doctrine2.

    J'ai des Users qui sont en relation avec d'autres Users, un peu comme les amis sur Facebook. Pour ca j'ai deux tables distinctes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ep_user: (PK = id)
     
    id : bigint
    username : varchar
    email : varchar
     Et une table pour gérer les relations :
     
    ep_user_relationship: (PK = id_user, id_relation. Tout deux pointant sur ep_user.id)
     
    id_user : bigint (La personne a lorigine de la demande)
    id_relation : bigint (La personne concernée)
    status : enum (pending, ignored, canceled, ...)
    Dans Symfony j'ai deux entités correspondantes User et UserRelationship. UserRelationship contient deux relations ManyToOne vers User :

    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
    class UserRelationship
    {
        /**
         * @ORM\Id
         * @ORM\ManyToOne(targetEntity="EP\UserBundle\Entity\User")
         * @ORM\JoinColumn(name="id_user")
         */
        private $user;
     
        /**
         * @ORM\Id
         * @ORM\ManyToOne(targetEntity="EP\UserBundle\Entity\User")
         * @ORM\JoinColumn(name="id_relation")
         */
        private $relation;
    Avec ca, je retrouve simplement la personne en question. Maintenant mon souci c'est que j'aimerai avoir toutes les personnes en relation avec un user, sachant qu'elles peuvent etre dans 'user' oou dans 'relation' en fonction de qui a initié la demande.

    Sur le coup je pensais faire une relation OneToMany bidirectionnelle dans User, mais je me suis rendu compte que je ne pouvais la faire pointer que sur une des deux entités inverses (ex: 'user') et donc que meme si ca marche d'un point de vue technique, il manquerait potentiellement la moitié des personnes (ex: celles référencées par 'relation').

    Je mets le code de la OneToMany ci-dessous pour que vous voyez, bien qu'il soit INCORRECT.

    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
    class User extends BaseUser
    {
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="bigint")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
     
        /**
         * @ORM\OneToMany(targetEntity="EP\UserBundle\Entity\UserRelationship", mappedBy="user")
         */
        protected $relations;
    Pourriez vous me donner un coup de main sur cette histoire ? Merci !

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

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

    Je pense qu'il te suffit de construire ta requête avec une jointure sur user ou sur relation.

  3. #3
    Membre à l'essai
    Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    si j'avais du php/sql traditionnel j'aurai effectivement fait une requete avec un "WHERE ur.id_user= :user OR ur.id_relation= :user".

    La je bloque plus sur le mapping Doctrine car sur l'attribut "relations" de l'entité "User", dans le "mappedBy" je ne peux mettre qu'un champ et non lui dire de regarder dans les deux. C'est pour ca que je me dis que la conception est peut etre fausse...

    Tu vois ce que je veux dire ?

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

    Informations forums :
    Inscription : Mai 2013
    Messages : 60
    Points : 80
    Points
    80
    Par défaut
    Si ce n'est que j'aurais utilisé un ON plutôt qu'un WHERE, je vois ce que tu veux dire.
    Le schema de la base de données ne fait pas tout, tu peux aussi construire tes propres requêtes. En l'occurrence, tu pourras utiliser la fonction innerJoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $qb->innerJoin('u.relations', 'u1', 'WITH', 'u.relations = u1.user')
         ->innerJoin('u.relations', 'u2', 'WITH', 'u.relations = u2.relation');

  5. #5
    Membre à l'essai
    Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Octobre 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Octobre 2006
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Merci frfrance, j'ai résolu mon souci grace à toi. Je mets ma requete ci-dessous si jamais ca peut aider quelqu'un dans un cas similaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT relations FROM EasyPrezzyUserBundle:User relations 
    WHERE relations.id IN (
        SELECT CASE WHEN u.id = :userId THEN r.id ELSE u.id END AS id_relation
        FROM EasyPrezzyUserBundle:UserRelationship ur INNER JOIN ur.user u INNER JOIN ur.relation r 
        WHERE (ur.user = :user OR ur.relation = :user) '.$whereClause.' '.$orderClause.'
    )
    PS : Je l'ai faite directement en query parce que je ne savais pas mettre les clauses where / order by dans la sous requete.

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

Discussions similaires

  1. Créer et effacer les relations entre les tables en VB
    Par polianita dans le forum Access
    Réponses: 7
    Dernier message: 04/08/2006, 11h54
  2. Comment mettre les relations entre mes requêtes?
    Par cheickssy dans le forum Access
    Réponses: 2
    Dernier message: 22/03/2006, 17h42
  3. Les relations entre tables
    Par sheira dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 20/03/2006, 15h03
  4. Pourquoi les relations entre les tables
    Par ghita269 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/12/2005, 11h54
  5. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07

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