我想象你会想要一个像这样的设置:Users
hasMany UserMessage
然后创建一个代表你的HABTM表的UserMessageUsers
模型。在该表格中,您将有一个名为read
的列,指示收件人是否已阅读该邮件。
下面是一些可以运行的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)
列。
因此,让我们说一个用户,“鲍勃”发送一封电子邮件到“莎莉”和“比尔”将有一条记录放入user_messages
,链接回“鲍勃”作为创作者。然后,将有两条记录user_messages_users
其具体user_messages
记录链接到两个“莎莉”和“条例”
现在,如果“萨利”读取消息的具体user_messages_users
记录将其read
栏更改为1 - 这表明她已阅读该消息。 “Bob的记录将保持为0 - 表示他没有阅读它。
要在HABTM表上执行更改,您需要为其创建一个模型。 CakePHP书talks about this,特别是关系的with
选项。
我不清楚你的问题是什么。你的方法从高层看起来不错(尽管我会避免命名你的表private_messages,因为这可能会给像我这样的程序员造成问题(我避免用名称b/c蛋糕分类中的下划线为保留的元意义) – 2010-12-09 19:47:01
I请提供关于这三种模型之间的关联的建议,以便这些条件发生 – linkyndy 2010-12-09 20:19:53