我想通过Propel 1.6使用流畅的ModelQuery 界面获取每个线程(私人消息传递系统)的最新条目。这将允许我重用两种方法来获取最新的条目,并且只获取涉及用户的条目(没有人希望看到不适合他的消息)。
我已经发现在标准SQL中我必须为每个论坛帖子使用子查询get the newest entry。我还发现在Propel中你必须使用Criteria::CUSTOM查询来实现这一点,但整个Criteria :: CUSTOM似乎都是pre-Propel-1.6,因为没有一个例子使用新的ModelQuery
现在的问题是,我想利用ModelQueries中的concenation功能,你可以在这里附加几个自己的方法,如下所示:
$entries = MessageQuery::create()
->messagesInvolvingUser($user) // user retrieved or sent the message
->newestFromThread() // get the latest entry from a lot of Re:-stuff
如果我不得不使用
,我认为这仍然不可能$c = new Criteria();
$c->add([the subquery filter]);
newestFromThread()
中的。
在给定以下方案的情况下,检索每个线程的最新条目的最佳方法是什么(thread_id
表示所有消息都属于同一个对应关系,我只希望每个thread_id
有一个条目:
id(INT)
title(VARCHAR)
thread_id(INTEGER)
date(DATETIME)
当前的PHP实现如下所示:
<?php
class MessageQuery extends BaseMessageQuery {
public function messagesInvolvingUser($user) {
return $this
->where('Message.AuthorId = ?', $user->getId())
->_or()
->where('Message.RecipientId = ?', $user->getId());
}
public function newestFromThread() {
return $this;
// To be implemented
}
}
我正在使用它:
$messages = MessageQuery::create()
->messagesInvolvingUser(Zend_Auth::getInstance()->getIdentity())
->newestFromThread()
->find();
答案 0 :(得分:1)
如何按日期排序结果(DESC)并限制为一个结果?
答案 1 :(得分:0)
考虑到关于pure SQL solutions的类似问题的答案,我想最简单的方法是添加一个新列最新,表明通信中哪条消息是最新的。这也可能更适合Propel的面向对象方法。我可以这样编写我的应用程序:
public function preInsert(PropelPDO $con = null) {
$this->setNewest(1);
$this->getEarlier()->setNewest(0);
return true;
}