2012-08-14 74 views
0

我嘗試編寫一個類似於facebook的消息系統。 我拿到了表格;CakePHP限制關聯

USERS 
id, name 

MESSAGES 
user_from, user_to, message 

和我的模型:

USER 

public $hasMany = array(
     'MessageFrom' => array(
      'className' => 'Message', 
      'foreignKey' => 'user_from' 
    ), 
     'MessageTo' => array(
      'className' => 'Message', 
      'foreignKey' => 'user_to' 
    ) 
); 
    var $hasAndBelongsToMany = array(
     'UserMessages' => array(
      'className' => 'User', 
      'joinTable' => 'messages', 
      'foreignKey' => 'user_from', 
      'associationForeignKey' => 'user_to' 
    ) 
); 

MESSAGE 

public $belongsTo = array(
     'UserFrom' => array(
      'className' => 'User', 
      'foreignKey' => 'user_from' 
    ), 
     'UserTo' => array(
      'className' => 'User', 
      'foreignKey' => 'user_to' 
    ) 
); 

一切工作不錯,我的意思是發送和從用戶recive mesages,閱讀它。 但我想在用戶面板上做聊天列表。

我必須選擇只有最後一條消息的所有用戶才能與用戶創建聊天列表。

我的數組是這樣的:

(int) 0 => array(
     'Message' => array(
      'id' => '12', 
      'user_from' => '2', 
      'user_to' => '1', 
      'message' => 'Hello user 1!', 
     ), 
     'UserFrom' => array(
      'id' => '2', 
      'username' => 'user2', 
     ), 
     'UserTo' => array(
      'id' => '1', 
      'username' => 'user1', 
     ) 
), 
(int) 1 => array(
     'Message' => array(
      'id' => '12', 
      'user_from' => '1', 
      'user_to' => '2', 
      'message' => 'Oh Hello user 2!', 
     ), 
     'UserFrom' => array(
      'id' => '1', 
      'username' => 'user1', 
     ), 
     'UserTo' => array(
      'id' => '2', 
      'username' => 'user2', 
     ) 
), 
    (int) 2 => array(
     'Message' => array(
      'id' => '12', 
      'user_from' => '1', 
      'user_to' => '5', 
      'message' => 'Message to user 5 from user 1', 
     ), 
     'UserFrom' => array(
      'id' => '1', 
      'username' => 'user1', 
     ), 
     'UserTo' => array(
      'id' => '5', 
      'username' => 'user5', 
     ) 
), 

現在的登錄用戶ID EX IM = 1,我想在我的聊天列表

USER 5(最後的消息看:消息從用戶5用戶1) USER 2(最後一條消息:哦你好用戶1)

的simpy:我想只有一個最後的消息,或從用戶的本陣...... 我不需要所有郵件列表...只有最後一個消息來自或來自用戶,比如GMAIL b牛。 現在,我有所有的用戶和消息關聯...

我創建一個函數...它獲取所有與用戶的消息... 如何獲得最大的唯一一個消息ID?

public function getChats($user_id) { 
    $this->order = 'Message.date DESC, Message.id DESC'; 
    $data = $this->find('all', array(
     'conditions' => array(
      'OR' => array(
       array('user_to' => $user_id), 
       array('user_from' => $user_id) 
      ) 
     ) 
    )); 
    return $data; 
    } 

-

SELECT `Message`.`id`, `Message`.`user_from`, `Message`.`user_to`, `Message`.`message`, `Message`.`date`, `UserFrom`.`id`, `UserFrom`.`username`, `UserFrom`.`email`, `UserFrom`.`password`, `UserFrom`.`name`, `UserFrom`.`surname`, `UserFrom`.`city`, `UserFrom`.`street`, `UserFrom`.`born_date`, `UserFrom`.`role`, `UserTo`.`id`, `UserTo`.`username`, `UserTo`.`email`, `UserTo`.`password`, `UserTo`.`name`, `UserTo`.`surname`, `UserTo`.`city`, `UserTo`.`street`, `UserTo`.`born_date`, `UserTo`.`role` FROM `gametrade_cake`.`messages` AS `Message` LEFT JOIN `gametrade_cake`.`users` AS `UserFrom` ON (`Message`.`user_from` = `UserFrom`.`id`) LEFT JOIN `gametrade_cake`.`users` AS `UserTo` ON (`Message`.`user_to` = `UserTo`.`id`) WHERE ((`user_to` = 1) OR (`user_from` = 1)) 
GROUP BY UserFrom.id,UserTo.id 
ORDER BY `Message`.`id` DESC 

該查詢選擇我的消息,但我不知道爲什麼被message.id DESC不要爲了它... 這個順序由mesage.id ASC ...

任何人都可以幫助我?

+0

請寫由你所得到的上述結果的查詢。所以我可以幫助一下。 – 2012-08-14 10:21:23

+0

您無法限制僅運行一個查詢的相關模型的結果。您必須運行第二個查詢或運行復雜/原始SQL查詢來完成此操作。 – rlcabral 2012-08-14 11:07:22

回答

0

可以傳遞一個時間戳,而查詢的信息,你必須節省時間戳記,同時節省消息

public function getChats($user_id,$timestamp) { 
    $this->order = 'Message.date DESC, Message.id DESC'; 
    $data = $this->find('all', array(
     'conditions' => array(
      'OR' => array(
       array('user_to' => $user_id), 
       array('user_from' => $user_id) 
      ), 
      'created >' => $timestamp 
     ) 
    )); 
    return $data; 
    }