如何在php消息系统中设置read unread标志



我正在用PHP开发一个Facebook类型的消息系统。我有一个user_message表,其中包含sender_idreceiver_idmessageflag作为已读/未读。在该表中插入值后,我将其设为未读,当用户单击消息通知时,状态将更新为已读

它对单个用户运行良好。不过,在向多个用户发送消息时,我将receiver_id作为逗号分隔的值存储在表中。我的问题是,如何为多个接收器设置标志?例如,如果我向3个用户发送一条消息,那么我如何设置read标志?任何帮助都将不胜感激。

在向多个用户发送消息时,我在表中以逗号分隔的值存储receiver_id。

不要滥用字符串列来表示多个值。在大多数DBMS中,不可能对这样结构的列进行索引,因此您将无法有效地搜索它。这对于"邮件收件人"结构来说尤其重要,因为这意味着不可能有效地搜索特定用户收到的所有邮件。这将使许多常见的操作,如检查发送给用户的新邮件,或查看用户的邮箱,在大型网站上变得极其缓慢。

相反,如果您希望将一条消息的单个表示发送给许多人,而不是为每个人单独发送一条消息,请使用两个表对此进行建模,例如

CREATE TABLE message (
id INTEGER PRIMARY KEY NOT NULL,
sender_id INTEGER NOT NULL,
message TEXT NOT NULL
);
CREATE TABLE message_recipient (
message_id INTEGER NOT NULL,
recipient_id INTEGER NOT NULL,
PRIMARY KEY (message_id, recipient_id)
);

有了这样的表结构,您可以在message_recipient对象上放置一个"已读"标志,这样给定消息的每个收件人都有一个单独的已读状态。

1)您可以添加名为"users_reads"的字段,并在其中放入用户的ID,这些用户读取消息,用逗号分隔。如何检查用户是否阅读了消息:

if (in_array($userId, explode(',', $row['users_reads']))) { ... }

2) You can add new table 'users_reads_messages' in your database with fields: - message_id - reader_id

3) you can make a copy of message with another reciever_id, I mean you put single user id in this field, for other users you make a copy of this message in your table.

p.s. sorry for my bad english

You can have a juntion table betweenmessagetable andreceivertable. For exampleMessageReadtable. it hasid(auto increment)message_idandreceiver_id. If user with id=10 read the message with id=5, you need to execute this query:

INSERT INTO MessageRead(message_id, receiver_id) VALUES(5, 10)

为了获取读取id=5的消息的用户数量,您可以执行以下查询:

SELECT COUNT(*) FROM MessageRead WHERE message_id = 5

并且,为了检查id=10的用户是否阅读了id=5的消息,执行以下查询:

SELECT COUNT(*) FROM MessageRead WHERE message_id = 5 AND receiver_id = 10

如果此查询的结果为1,则表示用户已阅读该消息,否则用户未阅读该消息。

最新更新