php友情系统

时间:2011-10-14 18:49:29

标签: php sql

如果有人可以帮我解决这个问题,我会非常感激!

我正在创建一个网站,我希望注册用户能够以朋友的身份互相添加。

此人必须“邀请”其他注册用户(在数据库上)。另一个人会收到某种通知。如果此人忽略了通知,则没有任何反应,当他/她批准时,他们就是朋友。

现在我对我要使用的表有一个想法:

+----------------------------------------+
|               Requests                 |
+----------------------------+-----------+
| id | user_from |  user_to  |   status  |  
+----+-----------+-----------+-----------+
|    |           |           |           |
|    |           |           |           |
|    |           |           |           |
|    |           |           |           |
+----------------------------+-----------+

正如我所说,这只是我想要使用的一个想法,但当我有一个链接添加一个人作为朋友时,我不知道PHP中的代码是什么。

我认为管理员会批准发送的请求以及用户何时批准。我不知道那张桌子会怎样。

我想过使用INNER JOIN将两个用户“加入”为朋友。但是,再次,不完全确定如何去做。这会在我的PHP中出现吗?让我们说friends.php?

SELECT name, email FROM users

INNER JOIN friends ON users.id = friends.user.id WHERE users.id = 1

正如我所说,我很清楚该怎么做,但在编码方面,我不完全确定如何做到这一点......

谢谢!

2 个答案:

答案 0 :(得分:1)

您应该有一个简单地关联user.id的关系表。

+-----------------------------------------+
|               relationships             |
+-----------------------------------------+
| id | user_id1  |  user_id2   |  status  |
+----+-----------+-------------+----------+
|    |           |             |          |
|    |           |             |          |
|    |           |             |          |
|    |           |             |          |
+------------------------------+----------+

其中user_id1和user_id2都是user.id.注意:我可能会将状态设为枚举,例如“待定,拒绝,朋友,敌人”。我最初想过使用一个bool,但是如果以后还有其他一些想要的状态呢?就像你跟踪破碎的友谊或其他一些关系一样。

然后你只需要做一个多个where子句来确定朋友: WHERE (user_id=:id OR friend_id=:id) AND status='friend'

答案 1 :(得分:1)

您的实施可能会有所不同 - 有多种方法可以提供您想要的功能,即:

  1. 用户A请求成为用户B的朋友
  2. 用户B收到好友请求的通知,可以接受,拒绝或忽略
  3. 每当用户B接受请求时,他们就是朋友
  4. 由于您的问题含糊不清,我只能提出建议,因为没有提出任何具体问题。

    SQL架构 - 您的表看起来适合朋友请求。您可能希望澄清表名,因为请求可以是一个广泛的主题。如果您在user_from,user_to列上定义唯一索引(这将阻止向同一个人发送重复的好友请求),则您不一定需要id列。同样,这是你的选择,没有一个答案必然是“正确的”。对于状态字段,请考虑使用请求的有效状态的ENUM,例如ENUM(“PENDING”,“DECLINED”)。

    就通知而言,执行此操作的最佳方法是在用户发起朋友请求时将通知插入通知表,而不是通过检查新朋友请求来尝试派生通知。第一种是更具可扩展性,并允许您出于各种原因发出通知。

    最后,一旦朋友请求成功,你可以做以下两件事之一:

    1. 从好友请求表中删除请求,然后插入好友表
    2. 将请求标记为已接受
    3. 再次,您在此处选择实施。选项#1允许您轻松查询朋友,但为每个友谊产生一个额外的表和(可能)两行,如果这是你选择实现它的方式。选项#2要求您在请求表中查询已完成的请求,使您的查询稍微复杂一些,而IMO则不那么直观,因为好友和好友请求不一定相关。此外,您可以在Friends表中添加字段,例如友情开始的日期,这在Friend Requests表中是没有意义的。

      查询 - 当您需要查找用户的朋友时,您可以执行与以下内容类似的操作,具体取决于您对SQL架构的决定:

      SELECT * FROM friends WHERE user_id = $user_id
      SELECT * FROM friends WHERE user_id = $user_id OR friend_id = $user_id
      SELECT * FROM friend_requests WHERE (user_from = $user_id OR user_to = $user_id) AND status = "COMPLETED"