2012-01-04 136 views
1

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

我的用户模型建立像这样:

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

我可以使用中可容纳只获得了用户和他们相关的消息,并添加条件,那些含陈述这些消息限制每个之间的那些用户和我登录的用户。

$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的用户被返回?

谢谢!

+0

我想'$ my_user_id'绝对设置,并有此ID的记录。检查查询的输出 - 是实际在SQL中应用条件的蛋糕吗?如果Cake正在查找用户表中的'receiver_id',则还可以尝试将表格/型号名称附加到每个条件字段。 – Ross 2012-01-04 10:38:26

+0

是的,它已设置。包含语句的条件是正在工作的 - 仅检索到或从$ my_user_id发送的消息。我的问题是,$用户包含我的数据库中的每个用户,甚至是那些SentMessages和ReceivedMessages为空的用户。我希望这些用户不要被检索。 – NathanGaskin 2012-01-04 10:44:42

+0

啊,我期望在这种情况下,这是因为你正在做一个'User-> find('all')'。我会发布可能有用的东西 – Ross 2012-01-04 10:47:12

回答

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) 
    ) 
); 
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,但不指定为找一个条件。

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

通过将条件添加到最初的查找中,您应该很好。

+0

感谢您的帮助!我不认为我的结果格式很清晰。我设法通过遍历数组来获得正确的格式。 http://pastebin.com/AiuuARpA是我认为最好的输出格式的快速转储。这是否使它更清晰? – NathanGaskin 2012-01-04 11:04:59