我正在尝试与相应的用户联系,以便按时间顺序显示个人资料的聊天列表。
array(
0 => array(
'Recepient' => array(
'id' => ...
'name' => ...
...
),
'Message' => array(
'content' => ...
'created' => ...
...
)
),
1 => ...
)
为了检索结果,我编写了这个find()方法:
$msgs = $this->Message->find('all', array(
'group' => array('Recepient.id'),
'order'=>'Message.created DESC',
'conditions'=>
array(
'OR'=> array(
array('recepient_id'=>$pid),
array('sender_id' => $pid)
)
)
));
我有什么:
问题:
因此,我有一个带有消息的用户列表,而不是最后一条消息的用户列表。我的查询有什么问题?谢谢你的帮助!
我在数据库中创建了“chat_id”字段,其基本上是按字母顺序排序的recepient_id + sender_id(因为如果user1向user2发送消息user1是发件人,稍后当user2响应时,他就成为发件人,因此排序将确保两个用户将始终具有相同的chat_id)。
比我在查询中添加了DISTINCT:
$this->Message->recursive = 0;
$msgs = $this->Message->find('all', array(
'fields' => array('DISTINCT Message.chat_id','Message.*','Recepient.*'),
'order'=>'Message.created DESC',
'conditions'=>
array(
'OR'=> array(
array('recepient_id'=>$pid),
array('sender_id' => $pid)
)
)
));
它不起作用!我现在正在为同一个对话收到多条消息。
如果我从查询中删除消息字段和收件人字段,我会得到正确数量的“聊天”。
'fields' => array('DISTINCT Message.chat_id'),
但那不是解决方案。
CakePHP版本2.7.0 MySQL DB
$msgs = $this->Message->find('all', array(
'order'=>'Message.created DESC',
'fields' => 'recepient_id, content, max(Message.created) as max_created',
'group'=>'recepient_id',
// 'contain' => array('Recepient'),
'conditions'=>array( 'chat_id' => $chats )
));
我放弃了单一查找方法来解决这个问题,所以现在1.我正在获取聊天列表,2。我想找到每个聊天的最后一条消息。 根据{{3}},我的查找查询应该有效。会发生什么
(int) 0 => array(
'Message' => array(
'recepient_id' => '55e6d764-1444-4aad-a909-9042f07f76da',
'content' => '1st msg',
'created' => '2015-09-20 18:24:17',
'created_nice' => '2 hours ago'
),
(int) 0 => array(
'max_created' => '2015-09-20 18:24:28'
)
),
字段max(
消息.
创建的)
确实显示了来自会话的最新消息,但0 =>消息数组用于不同的消息!您可以看到$results[0]['Message']['created']
时间与$results[0][0]['max_created']
不同!
答案 0 :(得分:0)
最后!工作解决方案:
$db = $this->Message->getDataSource();
$chats = $db->fetchAll(
'select id from (select * from messages order by created desc) Message
where recepient_id = "'.$pid.'" or sender_id = "'.$pid.'"
group by `chat_id`'
);
以上代码将根据要求检索所有消息。你可以
a) SINGLE QUERY 添加mysql JOIN以包含关联模型(我们保持代码单查询整洁)
b)两个查询但更聪明更简单的方法,只选择" ID"消息和创建另一个查询,将有蛋糕构建在可包含的行为。这也可能更好,因为将应用行为。
结果会有数组树,以便在下面的查询中挖出实际ID:
$chats = Set::extract("/Message/id",$chats);
c)将解决方案转换为CakePHP查询构建器... :)以获得挑战?