我想你会想要这样的设置:Users
hasMany UserMessage
,然后创建一个UserMessageUsers
代表你的 HABTM 表的模型。在该表中,您将有一个名为的列,该列read
指示收件人是否以及哪个收件人已阅读该邮件。
下面是一些 SQL,您可以运行这些 SQL 来设置我正在谈论的示例,以便您可以可视化这个想法。
CREATE TABLE `users` (
`id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`name` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`email` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `user_messages` (
`id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`user_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`subject` VARCHAR(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`body` TEXT COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `user_messages_users` (
`id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`user_message_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`user_id` CHAR(36) COLLATE utf8_unicode_ci NOT NULL,
`read` TINYINT(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
我对所有内容都使用 UUID,因此CHAR(36)
列。
因此,假设用户“Bob”向“Sally”和“Bill”发送了一封电子邮件,其中将放入一条记录user_messages
,其中链接回“Bob”作为创建者。然后会有两条记录user_messages_users
将特定user_messages
记录链接到“Sally”和“Bill”
现在,如果“Sally”阅读了该消息,则特定user_messages_users
记录将其read
列更改为 1——表示她已阅读该消息。“Bob”的记录将保持为 0——表示他还没有阅读它。
要对 HABTM 表执行更改,您需要为其创建一个模型。CakePHP 的书谈到了这一点,特别是with
关系的选项。