1

这是我在 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

{{ last_message.recipient }} 有效,但确实对于我的所有消息,收件人都是相同的。

我应该怎么做才能用 {{ last_message.sentAt }} 呈现最近的日期?非常感谢!

4

1 回答 1

3

如果我理解您想要实现的目标,您似乎使用了错误的方法。

按照函数名称,我假设您要检索有关员工发送的最新消息的信息。对于这样的情况,您要做的是按 sentAt 对消息进行排序,然后只选择第一个。

你实际上在做的是使用一个聚合函数,它会给你一个计算值,它实际上不是你的 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 来避免在找不到记录时抛出异常。纯粹是选择问题,但这意味着您在编码时会考虑到这种可能性。

于 2012-07-07T04:36:22.963 回答