我想更改我的留言列表页面/收件箱。目前它显示来自数据库的所有消息,如果有人向我发送了3次消息,它将全部显示在我的收件箱中。现在我想简单地说,每个发件人只会在列表中出现一次,并显示他/她发送的最新消息。
这是我在cakephp中的代码:
$this->paginate = array(
'Message'=> array(
'conditions'=>array('Message.recipient_id'=>$this->user_id),
'group' => array('Message.sender_id'),
'order'=>'message_sent_date DESC',
'limit'=> 20,
)
);
此代码的问题在于它显示了最早的邮件内容。我认为这是因为总是先订购之前。
我能够在mysql查询上执行此操作,但我不知道如何在cakephp上创建它。 这是我的疑问:
SELECT *
FROM(
SELECT *
FROM messages WHERE recipient_id = 114
ORDER BY message_viewed_date DESC
) AS messages
GROUP BY sender_id
ORDER BY message_viewed_date DESC
请帮帮我..谢谢。
答案 0 :(得分:0)
这应该可以解决问题(确保你的模型设置正确):
$results = $this->Message->find('all', array(
'conditions' => array(
'recipient_id' => 114
),
'group' => 'sender_id',
'order' => 'message_viewed_date DESC'
));
那里不需要子查询,它没有做任何花哨的事情。 The manual will help you with queries like this
答案 1 :(得分:0)
我使用Model :: query()http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#model-query
解决了这个问题这是我的代码:
$messages = $this->Message->query("SELECT id FROM(SELECT * FROM messages WHERE recepient_id = ". $this->user_id ." ORDER BY message_sent_date DESC) AS Message GROUP BY sender_id ORDER BY message_sent_date DESC");
for($i=0; $i<count($messages); $i++){
$message_id[$i] = $messages[$i]['Message']['id'];
}
$this->paginate = array(
'Message'=> array(
'conditions'=>array('Message.id' => $message_id, 'Message.recepient_id'=>$this->user_id, 'Message.hidden_on_to'=>false),
'limit'=>20,
'order'=>array('Message.message_sent_date' => 'DESC'),
'recursive'=>0,
'fields'=>array('Message.id', 'Message.message_content', 'Message.message_sent_date', 'Message.message_viewed_date', 'Sender.id', 'Sender.username')
)
);