Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Система друзей на PHP

#php #mysql


У меня есть страница, где должны выводиться:


заявки в друзья
уже подтверждённые друзья в таком виде: id - Username


Как реализовать такую систему на PHP:


какой должна быть структура БД?
как определить, что пользователь дружит или только отправил заявку?

    


Ответы

Ответ 1



Сделайте отдельную таблицу для заявок, к примеру reguests. Пускай она будет примерно так: | id | sender | taker | accept | Первые три поля понятны, а вот accept пускай имеет значения 1 или 0 в зависимости подтверждения заявки. То есть 1, если подтвердил, 0 если еще нет. Чтобы реализовать систему друзей, то сделайте таблицу frinends (к примеру) и пускай она имеет примерно такой вид: | id | id1 | id2 | В поля id1 и id2 вписываете двух человек, которые подружились. Потом просто проверяете наличие пары нужных ид в таблице. Вот. Коротко и думаю ясно) Недавно сам ломал голову над такой системой, так что буду рад помочь.

Ответ 2



Предположим, что таблица с пользователями у вас уже есть. Остаётся создать таблицу, в которой буду "статусы" отношений между ними и, если нужно, то можно сделать еще одну таблицу, в которой будут храниться значения статусов Таблица users_status: user_inviter (id юзера, который пригласил) user_invited (id приглашенного юзера) stat_val_id (текущий статус - ключ к полю stat_id в таблице ниже) Таблица status_value stat_id stat_val (пригласил, отклонил, принял, игнорировал etc.) UPD Смотреть запрос в работе или так: SELECT * FROM `userlist` WHERE `user_id` IN ( SELECT IF(`user_invited` = '3', `user_inviter`, `user_invited`) FROM `users_status` WHERE `stat_val_id` = '2' ) user_invited = '3' - "3" - id пользователя, у которого ищем друзей stat_val_id = '2' - "2" - статус, означающий "дружат"

Ответ 3



Тут можно обойтись и одной таблицей со полями userId1, userId2, status. Рассмотрим пример вконтактика - там если отправляешь заявку добавления в друзья, то становишься подписчиком, а когда заявку подтверждают, то друзьями. Здесь поле статуса отвечает как раз за определение типа связи, а их смена должна быть определена в триггерах. На уровень приложения смену статуса выносить не стоит. Пример. Пользователь делает заявку на добавление в друзья, при этом выполняется запрос: insert into friends_rels (userId1, userId2) values ($id1, $id2); А уже триггер должен определить является ли это заявкой, или же подтверждением. Определяет путем запроса к таблице: select userId1, userId2 from friends_rels where userId1 = $id2 and userId2 = $id1; Если находит, значит это подтверждение заявки: модифицирует строку NEW.status = 'friends' и выполняет update на заявку, где также присваивает статус того, что они - друзья. Если же запись селектом не была найдена, то значит это заявка на добавление в друзья и нужно лишь модифицировать статус: NEW.status = 'subscribe'. Первичный ключ для строки не стоит делать - он попросту не нужен, а нужно только повешать уникальность на сочетание двух полей. Таким образом вся логика сосредоточена в одном только триггере на уровне БД, т.е. на уровне хранения данных. Отсутствуют лишние Joinы для определения типа связи. Также не нужно обрабатывать кучу частных ситуаций типа той, когда одной пользователь сделал заявку второму, а второй пользователь сделал заявку на добавление в друзья первого - здесь все пройдет верно, а в других реализациях возможно отклонение от требуемого поведения.

Комментариев нет:

Отправить комментарий