这是我在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}}呈现最近的日期? 非常感谢!
答案 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,以避免在没有找到记录的情况下抛出异常。纯粹是一个选择问题,但这意味着你在编写代码时会考虑到这种可能性。