CakePHP消息系统

时间:2012-01-04 10:26:16

标签: cakephp cakephp-1.3 cakephp-appmodel

我正在尝试在CakePHP 1.3中实现一个简单的消息传递系统。我需要做的是执行一个查询来返回我登录的用户正在与之通话的用户数组(因此要么收到消息,要么发送消息,要么两者都有)。

我的用户模型设置如下:

class User extends AppModel {
    var $name = 'User';
    var $actsAs = array('Containable');

    var $hasMany = array(

        'SentMessages' =>
        array (
            'className' => 'Message',
            'foreignKey' => 'sender_id'
        ),

        'ReceivedMessages' =>
        array (
            'className' => 'Message',
            'foreignKey' => 'receiver_id'
        )
    );  
}

我可以使用Containable只检索用户及其相关消息,并为那些Contain语句添加条件,将这些消息限制为每个用户和我登录用户之间的消息。

$users = $this->User->find('all', array(
    'contain' => array(
        'ReceivedMessages' => array(
            'conditions' => array(
                'receiver_id' => $my_user_id
            )
        ),
        'SentMessages' => array(
            'conditions' => array(
                'sender_id' => $my_user_id
            )
        )
    )
));

但是,这仍然会返回我的数据库中的每个用户。有没有办法编写此查询,以便只返回具有任何SentMessages或ReceivedMessages的用户?

谢谢!

2 个答案:

答案 0 :(得分:1)

$users = $this->User->find('first', array(
    'conditions' => array('User.id' => $my_user_id),
    'contain' => array(
        'ReceivedMessages' => array(
            'conditions' => array(
                'receiver_id' => $my_user_id
            )
        ),
        'SentMessages' => array(
            'conditions' => array(
                'sender_id' => $my_user_id
            )
        )
    )
));

我的原因在于您找到all的原始代码,但未指定 查找的条件。

然后,Cake会返回所有用户及其存在的所有消息。我希望$users数组包含正确格式的正确数据,但您只需要特定用户。

通过将条件添加到初始查找中,您应该很高兴。

答案 1 :(得分:0)

我通过添加一个新的'对话'实体解决了这个问题:

var $hasMany = array(
    'Message' => array(
        'className' => 'Message',
        'foreignKey' => 'conversation_id'
    )
);

var $belongsTo = array(
    'FirstUser' => array(
        'className' => 'User',
        'foreignKey' => 'first_user_id'
    ),
    'SecondUser' => array(
        'className' => 'User',
        'foreignKey' => 'second_user_id'
    )
);

然后执行以下查找:

$conversations = $this->Conversation->find('all',array(
    'conditions' => array(
        'OR' => array(
            'Conversation.first_user_id' => $this->my_user_id,
            'Conversation.second_user_id' => $this->my_user_id
        ),
        'Conversation.modified >' => date("Y-m-d H:i:s", $since_timestamp)
    )
);