2010-12-09 107 views
0

我想我找到了解决我的问题的方法,但仍然不能满足我所有的需求。所以我诉诸你的建议。下面是基本上我想要实现:CakePHP私有消息架构和关联

我有3个数据库表:

  • 用户:ID,用户名,...
  • private_messages:ID,...
  • private_messages_users:ID ,private_message_id,SENDER_ID,recipient_id,状态

查看该数据库模式,你会发现,每封邮件我创建的连接表中的行,这意味着如果我将消息发送给两个收件人,连接表中将会有两个插入的行。如果你有更好的方法,我愿意接受建议。

我需要为了定义协会:

  • 能够撰写的消息;在撰写形式中,我想有一个多重列表,我可以从中选择我想要发送信息的收件人;发件人在这里并不重要,因为我将它手动添加到$ this-> data数组中,然后保存
  • 能够创建一个收件箱和一个已发送的文件夹,我将分别获取收到的所有邮件,发送到
  • 能够查看已发送的消息,连同它被送到
  • 所有收件人能够标记的消息时用户观看它首次
  • 也对于每个SENDER_ID和recipient_id如读,我会喜欢从用户表中获取用户名

我希望所有操作都需要ested完成'cakily',这意味着没有'黑客'或方法来转换数组。只是简单的操作,完全基于所创建的关联。

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

+1

我不清楚你的问题是什么。你的方法从高层看起来不错(尽管我会避免命名你的表private_messages,因为这可能会给像我这样的程序员造成问题(我避免用名称b/c蛋糕分类中的下划线为保留的元意义) – 2010-12-09 19:47:01

+0

I请提供关于这三种模型之间的关联的建议,以便这些条件发生 – linkyndy 2010-12-09 20:19:53

回答

0

我想象你会想要一个像这样的设置: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选项。