Cakephp система взаимной дружбы - PullRequest
0 голосов
/ 14 октября 2011

В течение недели или около того я пытался выяснить, как мне создать правильную систему дружбы в CakePHP.Я прочитал эту и эту ветку, но я не могу заставить ее работать.

Я прочитал об этом гораздо больше тем, но, похоже, ни у кого нет подходящего примера.

В настоящее время у меня есть таблица пользователей (идентификатор, имя пользователя, пароль, электронная почта и т. Д.).) и таблица дружеских отношений (id, user_to, user_from, status).

Шаг 1 - запрос дружбы

Если пользователь отправляет запрос дружбы, тогда строкавставляется с запрашивающим user_id и user_id пользователя, от которого запрашивается дружба, поэтому он может выглядеть следующим образом:

id |user_from |user_to |статус


1 |1 |2 |0

Таким образом, я могу легко показать ожидающих друзей user_id = 2, выбрав все записи, где user_to = 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 ]

1 голос
/ 03 февраля 2012

Вот мое решение: трудность заключается в правильном запросе, потому что запросы на добавление в друзья могут быть пересечены (если A запрашивает B или B запрашивает, A будет сохранен в полях «to» и «from» таблицы противоположным образом),Давайте сделаем так, и пользователь UNION и псевдонимы получат друзей от любого пользователя независимо от приведенной ниже таблицы отношений.

  1. Таблица [friends] (отношение): to | from | statut (в ожидании, подтверждено)
  2. "to" и "from"> ограничение foreign_keys для таблицы [users]

Запрос ниже всегда дает желаемые результаты!(замените% 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'
1 голос
/ 14 октября 2011

Вы можете найти запросы на добавление в друзья для 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)

Этот код не был проверен, но вы поняли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...