Cakephp互惠友谊系统

时间:2011-10-14 10:49:36

标签: mysql cakephp

我一直试图找出一个星期左右,我如何在CakePHP中建立一个合适的友谊系统。我已阅读thisthis帖子但我无法让它发挥作用。

我已经阅读了很多有关此问题的主题,但似乎没有人有适当的例子。

我目前有一个表用户(id,用户名,密码,电子邮件等)和表友谊(id,user_to,user_from,status)。

第1步 - 友情请求

如果用户执行了友情请求,则会插入一行,其中包含请求user_id和请求友谊的用户的user_id,因此它可能如下所示:

id | user_from | user_to |状态


1 | 1 | 2 | 0

通过选择user_to = 2

的所有记录,我可以通过这种方式轻松显示user_id = 2的待定好友

第2步 - 确认友谊

我已将其设置为user_id 2现在看到user_id 1想要成为朋友,如果他点击确认链接,状态将更改为1,见下文

id | user_from | user_to |状态


1 | 1 | 2 | 1

我创建了各种检查,因此行保持唯一。

第3步 - 向朋友展示

我认为这很容易,如果我想向user_id = 1的朋友展示,那么我只需用user_from = 1或user_to = 1进行选择,但这不起作用。

User_id 1可以是请求者,但也可以被请求,因此JOIN将显示奇怪的结果。

有谁知道解决方案?如果我没有做好整件事,我很乐意重建整个系统!任何正确方向的提示都是受欢迎的......

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式找到ID = 1的朋友请求:

select * from Users u1 where u1.user_to = 1 and u1.user_from not in (select u2.user_to
from Users u2 where u2.user_from = u1.user_to)

您可以通过以下方式找到ID = 1的好友请求:

select * from Users u1 where u1.user_from = 1 and u1.user_to not in (select u2.user_from
from Users u2 where u2.user_to = u1.user_from)

你可以通过这种方式找到ID = 1的相互友谊:

select * from Users u1 where ((u1.from = 1) or (u1.to = 1)) and 0 < (select count(*) from
Users u2 where u1.from = u2.to and u1.to = u2.from)

此代码未经过测试,但您明白了。

答案 1 :(得分:1)

这是我的解决方案:困难在于正确的请求,因为朋友请求可以被交叉(如果A要求B或B要求A将以相反的方式存储在表的“to”和“from”字段中) 。让我们这样做,用户UNION和别名可以独立于下面的关系表从任何用户那里获取朋友。

  1. [朋友]表(关系):to | from | statut(待定,已确认)
  2. “to”和“from”&gt; foreign_keys约束到[users]表
  3. 以下请求始终提供所需结果! (用SESSION中的用户ID或用户ID替换%d

    SELECT
        users.userNickname,
        friends.to AS friendUser,
        friends.from AS currentUser,
        friends.statut
        FROM
        users
            INNER JOIN
            friends
            ON
            users.userId = friends.to
        WHERE
        friends.from = '%d' 
    UNION
        SELECT
        users.userNickname,
        friends.from AS friendUser,
        friends.to AS currentUser,
        friends.statut
        FROM
        users
            INNER JOIN
            friends
            ON
            users.userId = friends.from
        WHERE
        friends.to = '%d'