Relation amis (bilatéral)

Par TransientDev, il y a 11 ans


Bonjour,
je souhaite réaliser une relation amis mais je n'arrive pas a le faire en une seule relation dans le modele User.
Si quelqu'un à une idée de la methode à utiliser pour représenter cette relation, ce serait très gentil de sa part de m'éclairer ^_^.

cordialement.

5 réponses

Grafikart, il y a 11 ans

C'est une relation hasAndBelongsToMany qu'il te faut mais effectivement le côté bilatéral je ne sais pas comment tu peux le faire comprendre au framework.

TransientDev, il y a 11 ans

Bonjour,
le soucis c'est que cela va créer des doublons car si je crée une relation du type:

public function friends() { return $this->belongsToMany('User', 'friends', 'user_id', 'friend_id'); }

et que j'appel

return User::find($id)->friends;

j'aurais tout les utilisateurs situés dans le champ "friend_id", or je souhaite qu'il me retourne aussi ceux qui sont les amis de l'utilisateur et sont dans le champ "user_id". ( user_id est la personne qui fait la demande et friend_id celui qui la reçoit).
J'ai essayé d'utiliser une union dans la méthode friends mais il me retourne une erreur (il est probable que je m'y prenne mal) .

TransientDev, il y a 11 ans
<table> <tr> <th>user_id</th> <th>friend_id</th> </tr> <tr> <td>1</td> <td>2</td> </tr> <tr> <td>3</td> <td>1</td> </tr> <tr> <td>3</td> <td>2</td> </tr> <tr> <td>4</td> <td>1</td> </tr> <tr> <td>1</td> <td>5</td> </tr> </table>

Si je demande tout les amis de l'utilisateur 1 avec le code utilisé plus haut, j'aurais 2 et 5 or ce que je chercher a réaliser me retournerais 2,3,4 et 5. Et je voulais savoir si il est possible de le faire en 1 seule relation ou si je dois en créer deux et faire l'union des deux retours avant de renvoyer le resultat.

Grafikart, il y a 11 ans

Pour ça que je pense que tu devrais te créer ton propre comportement. Peut être t'inspirer du code de Laravel pour créer un nouveau type de liaison ^^

TransientDev, il y a 11 ans

Oui il va bien faloir, pour le moment je l'ai décomposé en deux partie (asking/asked) et puis on verra a la fin du projet si j'ai le temps de faire quelquechose de propre.