【问题标题】:CakePHP Messaging SystemCakePHP 消息系统
【发布时间】:2012-02-02 06:14:19
【问题描述】:

我正在尝试在 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 的用户?

谢谢!

【问题讨论】:

  • 我假设$my_user_id肯定是设置的,并且有这个ID的记录。检查查询的输出 - cake 是否真的在 SQL 中应用条件?您还可以尝试将表/模型名称附加到每个条件字段,以防 Cake 在用户表中查找 receiver_id
  • 是的,已经设置好了。包含语句的条件有效 - 仅检索到或来自 $my_user_id 的消息。我的问题是 $users 包含我的数据库中的每个用户,即使是 SentMessages 和 ReceivedMessages 为空的用户。我希望根本不检索这些用户。
  • 啊,我希望在这种情况下是因为您正在执行User->find('all')。我会发布一些可能有用的东西

标签: cakephp cakephp-1.3 cakephp-model


【解决方案1】:

我通过添加一个新的“对话”实体解决了这个问题,如下所示:

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)
    )
);

【讨论】:

    【解决方案2】:
    $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 的原始代码中,但没有指定 that 查找的条件。

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

    通过将条件添加到初始查找中,您应该一切顺利。

    【讨论】:

    • 感谢您迄今为止的帮助!我认为我对所需的结果格式不是很清楚。我已经设法通过遍历数组来获得正确的格式。 pastebin.com/AiuuARpA 是我认为最好的输出格式的快速转储。是不是更清楚了?
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多