Cakephp中的关系问题。如何获取数据?

时间:2010-02-22 07:41:27

标签: cakephp relationship

我正在尝试制作类似于facebook的消息功能。只是消息的事情,而不是Facebook。简要说明就是这样的。

1)有许多用户(用户表)2)一个人可以向一个或多个人发送消息。 3)可以对同一消息进行多次回复。 4)如果发送给多个人。所有人都可以回复,并向所有人展示。

使用的表格

消息表

id
timestamp
sender_id
subject
message
due_date
urgent_flag
open_flag
reply_id

message_user(table)

id
timestamp
message_id
receiver_id
read_flag

CakePHP关系如下:

消息模型

var $hasMany = array(
        'MessageUser' => array(
            'className'     => 'MessageUser',
            'foreignKey'    => 'message_id',    
                )
    );  
var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'sender_id',
    )
);
var $hasAndBelongsTo=array(
    'Message' => array (
        'className' => 'Message',
        'foreignKey' => 'reply_id',
       )
);

MessageUser Model

var $belongsTo = array (
    'User' => array (
        'className' =>  'User',
        'foreignKey' => 'receiver_id',
    ),
    'Message' => array (
        'className' =>  'Message',
        'foreignKey' => 'message_id'

    )
);

问题:

1)我的方法是否正确?或者需要修改数据库模式。 2)如果是,我应该如何获取收件箱的数据?这有点复杂,因为我想显示人们发给我的那些消息的对话。

例如,用户1向用户2发送消息。用户2向其添加2个回复。然后,用户1的收件箱应该只显示1条消息。当我打开它。它也将显示以前的消息..(这类似于facebook)

我在这里看到的另一个问题是,如何删除邮件?假设用户1删除了一条消息,它不应该在他的收件箱中显示任何内容。但是用户2可以看到他所拥有的整个对话。

1 个答案:

答案 0 :(得分:0)

WRT你的架构,我只会设置你需要访问它们的方向的关系。因此,如果您不需要在给定消息的情况下访问用户,请不要将消息链接回用户。它可以创建一些递归问题,你的模型会自动获取太多的数据,因为你有一个循环循环(User hasMany Message,Message HasMany User等)。这实际上是HABTM的关系,所以使用它而不是hasMany(如果你想要它是一个双向关系)。

我的评论提到了树的行为。简而言之,它允许您轻松地将层次数据存储到关系数据库表中。我不会重复该手册,但请查看http://book.cakephp.org/view/91/Tree并查看示例。我很确定这是您想要用于线程回复的内容。

还有一点需要注意 - 如果您打算在严肃的用户群中使用它,请在数据库的这一部分上运行一些负载测试。我不确定TreeBehavior在廉价服务器上如何使用数百万行。