8

与 eloquent 建立友谊关系的最佳方式是什么?我的表模式如下,我想定义一个关系,我可以检索所有朋友,如下所示。

<?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 |
+----+---------+-----------+----------+---------------------+---------------------+

当我寻找用户 id 为 3 的朋友时,上面的关系接近工作,我得到用户 1 和 3,但显然我想要 1 和 2。

友谊桌

user_id:请求
好友的用户idfriend_id:目标好友的用户id
状态:好友状态是挂起、接受还是阻塞。
created_at 和 updated_at

我知道Laravel 的解决方案 多对多自引用表仅适用于一种方式,我可以从关系双方检索朋友,但我必须是两行,例如,如果用户 1 和 3 是朋友,那么在一行 user_id = 3 和friend_id = 1,在下一行反之亦然。(或者如果我没有两行,我必须做两个查询)。

4

3 回答 3

6

您可以进行两次查找,并使用联合查询,因此只能访问数据库一次。将所有这些放在自定义函数中:

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);  
  }
}
于 2013-07-25T11:26:09.503 回答
4

您不应该尝试将应该是两行的内容变成一行,但是如果您要尝试这样做,那么您绝对不需要两次访问数据库:

select * from users where (user_id = :user_id and friend_id = :friend_id) or  (friend_id = :friend_id and user_id = :user_id)

在 Laravel 中将是:

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

您也可以对它们进行分组,但这有点复杂。

于 2013-08-16T19:54:38.943 回答
-3

我有一个建议,你使用条件来加载你想要的 vlaues

  • 在此示例中,假设您使用 query 加载 user_id 和 fiend_id 的条件,

    " select * fromfriendship WHERE user_ID = '$id' ORfriend_ID = '$id' "

$id : 是您要向他的朋友展示的用户 ID。

在 PHP 的 WHILE 循环中,您将使用它来加载结果,您可以通过条件过滤结果

while ... {

if (friendship['user_id'] == $id) {

$f_id = friendship['friend_id'] ;  }

// other instructionS...

else  {

$f_id = friendship['user_id'] ;  } 

// other instructionS...

}

在这种情况下,您将从两个表列中加载数据,然后每次使用用户 id 过滤列,并且只让他的朋友的 id ,过滤器过去不会告诉用户您是自己的朋友。

对不起,我用 mysql 来解释这个例子

于 2013-07-28T10:13:08.983 回答