DQL Query,MAX函数和getSingleResult

时间:2012-07-06 15:17:12

标签: symfony doctrine-orm twig

这是我在MessageRepository中的DQL查询:

public function getLastByIdAndByType($id_employee, $type)
{
    $query = $this->_em->createQuery('SELECT MAX(m.sentAt), m.recipient,   m.author, m.subject, m.body, m.type FROM MyBundle:Message m JOIN m.employee e WHERE e.id = :id_employee AND m.type = :type')
    ->setParameter('id_employee', $id_employee)
    ->setParameter('type', $type)
    return $query->getSingleResult();
}    </code>

In my controller : $last_message=$em->getRepository('MyBundle:Message')->getLastByIdAndByType($id, $type);

In my view html.twig {{ last_message.sentAt }}

returns the error : Item "sentAt" for "Array" does not exist

While

public function getLastByIdAndByType($id_employee, $type) { $query = $this->_em->createQuery('SELECT MAX(m.sentAt), m.recipient, m.author, m.subject, m.body, m.type FROM MyBundle:Message m JOIN m.employee e WHERE e.id = :id_employee AND m.type = :type') ->setParameter('id_employee', $id_employee) ->setParameter('type', $type) return $query->getSingleResult(); } </code> 有效,但对于我的所有邮件,收件人都是一样的。

我应该如何使用{{last_message.sentAt}}呈现最近的日期? 非常感谢!

1 个答案:

答案 0 :(得分:3)

如果我理解你想要实现的目标,看起来你正在使用错误的方法。

按功能名称,我假设您要检索有关员工发送的最新消息的信息。 对于这样的情况,你想要做的是通过sentAt订购消息并选择第一个消息。

您实际在做的是使用aggregate function,它会为您提供一个实际上不属于您的Message实体的计算值。

这是一个如何做你想要的事情的例子(请注意,因为我正在检索整个实体,你可以在你的视图中使用你喜欢的任何属性 - 出于性能原因你仍然可以选择选择个人查询中的属性):

public function getLastByIdAndByType($id_employee, $type)
{
    $query = $this->_em->createQuery('SELECT m FROM MyBundle:Message m JOIN m.employee e WHERE e.id = :id_employee AND m.type = :type ORDER BY m.sentAt DESC')
                       ->setMaxResults(1)
                       ->setParameter('id_employee', $id_employee)
                       ->setParameter('type', $type);
    return $query->getOneOrNullResult();
}

另外值得注意的是,你可以像我在这里一样使用getOneOrNullResult,而不仅仅是getSingleResult,以避免在没有找到记录的情况下抛出异常。纯粹是一个选择问题,但这意味着你在编写代码时会考虑到这种可能性。