0

我以为我找到了解决问题的方法,但我的方法仍然不能满足我的所有需求。因此,我求助于您的建议。这基本上是我想要实现的目标:

我有 3 个数据库表:

  • 用户:ID,用户名,...
  • 私人消息:ID,...
  • private_messages_users:id、private_message_id、sender_id、receiver_id、状态

查看这个数据库模式,您会注意到对于每条消息,我在连接表中创建了一行,这意味着如果我向两个收件人发送消息,连接表中将插入两个行。如果您有更好的不同方法,我愿意接受建议。

我需要定义关联以便:

  • 能够撰写信息;在撰写表单中,我想要一个多重列表,我可以从中选择我想向其发送消息的收件人;发件人在这里并不重要,因为我会在保存之前将其手动添加到 $this->data 数组中
  • 能够创建一个收件箱和一个已发送文件夹,我将分别在其中获取所有收到的消息,发送
  • 能够查看已发送的消息,以及它发送到的所有收件人
  • 能够在用户第一次查看消息时将消息标记为已读
  • 另外,对于每个 sender_id 和 recipient_id,我想从 users 表中获取用户名

我希望所有请求的操作都“cakily”完成,这意味着没有“hacks”或转换数组的方法。只是简单的操作,完全基于创建的关联。

任何帮助将不胜感激,因为我在这个问题上苦苦挣扎了一个多星期。非常感谢!

4

1 回答 1

0

我想你会想要这样的设置:UsershasMany 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关系的选项。

于 2011-02-10T00:12:49.467 回答