如何在Propel 1.6中检索每个线程的最新问题?

时间:2011-09-13 17:10:13

标签: propel

我想通过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();

2 个答案:

答案 0 :(得分:1)

如何按日期排序结果(DESC)并限制为一个结果?

答案 1 :(得分:0)

考虑到关于pure SQL solutions的类似问题的答案,我想最简单的方法是添加一个新列最新,表明通信中哪条消息是最新的。这也可能更适合Propel的面向对象方法。我可以这样编写我的应用程序:

public function preInsert(PropelPDO $con = null) {
    $this->setNewest(1);
    $this->getEarlier()->setNewest(0);

    return true;
}