8
votes

Laravel OrM Relation d'amitié sans duplication

Quel est le meilleur moyen de modéliser une relation d'amitié avec Eloquant? Mon schéma de table est ci-dessous et je voudrais définir une relation où je pourrais récupérer tous les amis comme suit comme suit.

<?php

class User extends Eloquent {

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

+----+---------+-----------+----------+---------------------+---------------------+
| id | user_id | friend_id | state    | created_at          | updated_at          |
+----+---------+-----------+----------+---------------------+---------------------+
|  1 |       3 |         1 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 |       2 |         3 | accepted | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------+-----------+----------+---------------------+---------------------+


0 commentaires

3 Réponses :


6
votes

Vous pouvez faire deux recherches, et utiliser une requête Union , ce qui ne frappe donc que la base de données une fois que . Mettez tout cela dans une fonction personnalisée:

class User extends Eloquent {

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


1 commentaires

Merci, cela ressemble exactement à ce que je veux, cependant, j'ai eu cette erreur d'erreur 1 passée à illuminate \ Base de données \ Query \ Builder :: Mergebindings () doit être une instance de Illuminate \ Base de données \ Query \ Builder, instance de Illuminate \ Base de données \ Eloquent \ RELATIONS \ APPARTEMENTAIRES DONNÉES, APPOSITIONNÉE IN / VAR / VAR / CC / VENDOR / DELUMINE / SRC / Illuminate / Base de données /Quisery/Builder.php à la ligne 857 et définie



-3
votes

J'ai une suggestion que vous utilisez des conditions pour charger les vlaues que vous voulez

  • Dans cet exemple, disons que vous avez utilisé la requête pour charger user_id et fiend_id avec condition,

    "SELECT * de meciddship où user_id = '$ id' ou ami_id = '$ id'" $ id '"

    ID $: est l'identifiant de l'utilisateur que vous souhaitez afficher ses amis.

    à l'intérieur de la boucle tandis que vous utiliserez pour charger les résultats que vous pouvez filtrer des réduits xxx

    Dans ce cas, vous chargez des données des deux colonnes de table, puis de filtrer chaque fois la colonne avec l'ID utilisateur et ne laissez pas l'identifiant de son ami, le filtre utilisé pour ne pas dire à l'utilisateur que vous êtes ami avec vous-même.

    désolé, j'ai utilisé MySQL pour expliquer l'exemple


1 commentaires

Je ne suis pas sûr de savoir comment je pourrais utiliser cela à Eloquent?



4
votes

Vous ne devriez pas essayer de tourner ce qui devrait être deux rangées en une rangée, mais si vous allez essayer de le faire, vous n'avez certainement pas besoin de toucher la base de données deux fois:

Users::whereRaw('(user_id = ? and friend_id = ?) or (friend_id = ? and user_id = ?)', [            
    $user_id,
    $friend_id,
    $friend_id,
    $user_id
]);


0 commentaires