我一直试图找出一个星期左右,我如何在CakePHP中建立一个合适的友谊系统。我已阅读this和this帖子但我无法让它发挥作用。
我已经阅读了很多有关此问题的主题,但似乎没有人有适当的例子。
我目前有一个表用户(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将显示奇怪的结果。
有谁知道解决方案?如果我没有做好整件事,我很乐意重建整个系统!任何正确方向的提示都是受欢迎的......
答案 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和别名可以独立于下面的关系表从任何用户那里获取朋友。
以下请求始终提供所需结果! (用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'