Doctrine - relation entre deux tables sur deux attributs

Le problème exposé dans ce sujet a été résolu.

Bonsoir,

Je cherche désespéramment la solution à un problème sur la création d’un lien entre deux tables. C’est ma première utilisation de Doctrine, et dès les deux premiers objets je bloque :( Pas très encouragent…

Voici un petit résumé du problème.

J’ai deux classes. L’une s’appelle User et l’autre FriendLink.

Les deux tables associées à chaque objets

La première, comme son nom l’indique, stocke les utilisateurs et la deuxième les liens d’amitiés. Chaque amitié est réciproque. Je m’explique.

Soit l’utilisateur Aid=1 et l’utilisateur Bid=2. Aid=1 et Bid=2 sont amis. Dans la table correspondante à l’objet FriendLink, appelée friend_links, cette amitié est représentée par deux lignes :

  • user_id=1 et friend_id=2 ;
  • user_id=2 et friend_id=1.

Pour chacun des deux utilisateurs, il y a un lien avec les deux lignes. Par exemple si Aid=1 est supprimé, alors les deux lignes devront être supprimée. Cela ne serait pas cohérent d’en garder une, puisque l’identifiant 1 n’existe plus dans users.

C’est là que je bloque. Sachant qu’il y a deux attributs de la table friend_links qui ont un lien avec users je suis perdu. Théoriquement il s’agirait d’une relation OneToMany() mais j’ai l’impression que cela ne fera pas l’affaire (j’ai tenté un truc ici mais je me suis arrêté ne sachant pas comment continuer).

Merci d’avance pour votre aide ! N’hésitez pas à me dire si ce n’est pas clair, j’ai du mal à expliquer d’une manière générale.

PS: Merci pour ton tuto @BestCoder ;)

Salut !

J’ai l’impression que ce serait une "simple OneToManyToOne". Reste qu’effectivement, il faut deux propriétés dans User pour la matérialiser. Une qui représente les amis "demandés par l’utilisateur " et une autre "les amis qui ont demandé à l’utilisateur" ?

Est-ce qu’il y a une raison particulière pour enregistrer la relation deux fois (tu parles bien de deux lignes dans la table), sachant que justement si elle est supprimée par l’un ou l’autre, les deux enregistrements seront supprimés ? Je pense qu’on pourrait mettre toutes les informations dans une seule ligne. Après tout, la relation est unique, même si les deux parties la voient différemment.

+0 -0

Je pense que je vais opter pour ta deuxième solution. La première me semble plus complexe et répétitive… Même si c’est dommage conceptuellement de devoir mettre la relation sur une ligne. Mais comme la seule valeur qui pouvait varier d’une ligne à une autre était la variable authorization, cela ne sera pas trop compliqué.

La table permettant d’avoir les deux lignes en une sera :

friends_links
id
user_id
friend_id
facebook_mutual_friends
facebook_mutual_likes
authorization_user
authorization_friend
creation_datetime

Merci pour ta réponse !

EDIT : Pour mettre en place ensuite la relation entre les deux objets (après avoir simplifié la relation sur une ligne) j’ai suivi ce tuto qui correspond très bien à la situation : https://www.future500.nl/articles/2013/09/more-on-one-to-manymany-to-one-associations-in-doctrine-2/ (Merci à @Cara pour ce lien !)

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte