CakePHP find()组和按日期排序复杂条件

CakePHP find()组和按日期排序复杂条件,cakephp,find,cakephp-2.7,cakephp-2.x,Cakephp,Find,Cakephp 2.7,Cakephp 2.x,我试图获取与他们相应的用户的消息,以便按时间顺序显示他们的最后一条消息的聊天列表 array( 0 => array( 'Recepient' => array( 'id' => ... 'name' => ... ... ), 'Message' => array( 'content' => ...

我试图获取与他们相应的用户的消息,以便按时间顺序显示他们的最后一条消息的聊天列表

array(
    0 => array(
        'Recepient' => array(
            'id' => ...
            'name' => ...
            ...
        ),
        'Message' => array(
            'content' => ...
            'created' => ...
            ...
        )
    ),
    1 => ...
)
为了检索结果,我编写了以下find()方法:

我所拥有的:

  • 带有相应“Recepient”的消息
  • 按时间顺序
问题是:

  • 查询没有从$recepient\u id/$sender\u id组合中检索最近的邮件
因此,我没有最后一条消息的用户列表,而是有一条消息的用户列表。我的问题出了什么问题?谢谢你的帮助

方法2结果 我在数据库中创建了“chat\u id”字段,基本上是按字母顺序排序的recepient\u id+sender\u id(因为如果user1向user2发送消息,user1就是sender,稍后当user2响应时,他就成为sender,所以排序将确保两个用户始终具有相同的chat\u id)

然后,我在查询中添加了DISTINCT:

$this->Message->recursive=0;
$msgs=$this->Message->find('all',数组(
'fields'=>array('DISTINCT Message.chat_id'、'Message.*'、'Recepient.*'),
'order'=>'Message.created DESC',
“条件”=>
排列(
'或'=>数组(
数组('recepient_id'=>$pid),
数组('sender_id'=>$pid)
)
)
));

而且它不起作用!我现在收到同一对话的多条消息

如果我从查询中删除消息字段和收件人字段,我将获得正确数量的“聊天”。
'fields'=>数组('DISTINCT Message.chat\u id'),
但这不是解决办法

CakePHP版本2.7.0 MySQL数据库

方法3结果
$msgs=$this->Message->find('all',数组(
'order'=>'Message.created DESC',
'fields'=>'recepient\u id,content,max(Message.created)作为max\u created',
'group'=>'recepient_id',
//'contain'=>array('Recepient'),
'条件'=>数组('chat\u id'=>$chats)
));

我放弃了单一查找方法来解决这个问题,所以现在1.我得到了聊天列表,2.我想找到每个聊天的最后一条消息。 根据我的发现,查询应该是有效的。发生的是

(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(
Message
创建的
确实显示了来自对话的最新消息,但是0=>消息数组用于不同的消息!正如您所看到的,
$results[0]['Message']['created']
时间和
$results[0][0]['max_created']
是不同的

终于!工作解决方案:

$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) 单一查询添加mysql连接以包含关联模型(我们保持单一查询代码整洁)

b) 两个查询,但更智能更简单的方法,只选择消息的“ID”,并创建另一个具有cake内置可包含行为的查询。这可能更好,因为将应用行为

因此,您将有一个数组树,要为下一次查询挖掘实际ID,请使用以下命令:

$chats=Set::extract(“/Message/id”,$chats)


c) 将解决方案转换为CakePHP查询生成器…:)准备接受挑战吗

邮件
是否有许多
收件人
?您是否检查了Cake为此查找生成的SQL查询?我怀疑这个问题不是你所期望的!您使用的是什么版本的CakePHP?听起来像是
distinct
是一个您应该了解的术语。。。在…中有带有
不同的
的示例,您知道如何为此编写SQL语句吗?如果是,分享它。如果不是,当您的问题是从$recepient\u id/$sender\u id组合检索最新邮件时,您至少不希望按
Recipient.id对邮件进行分组。您还需要说明您正在使用的数据库。请详细说明您所说的
最后一条消息的用户列表,我有一个消息的用户列表
。对我来说,它们听起来没什么不同
$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`'
);