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 !