2012-07-06 66 views
1

這是我DQL查詢在MessageRepository: DQL查詢,MAX功能和getSingleResult

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);

在我看來html.twig {{ last_message.sentAt }}

返回錯誤:Item "sentAt" for "Array" does not exist

雖然

{{last_message.recipient}}的作品,但它是真的,我的所有郵件收件人是一樣的。

我應該怎麼做來呈現最新的日期與{{last_message.sentAt}}? 非常感謝!

回答

3

它看起來像你使用了錯誤的方法,如果我理解你想要達到的目標。

函數名去,我假設你想檢索着被員工送往最近的消息信息。 對於這樣的一個情況下,你想要做的是爲了通過sentAt消息,並選擇只是第一個。

你實際上做的是使用aggregate function,它會給你一個計算值實際上不是你的信息實體的一部分。

下面是一個如何做你想要的例子(請注意,因爲我檢索整個實體,你可以在你的視圖中使用任何你喜歡的屬性 - 爲了性能的原因,你仍然可以選擇在查詢個人屬性):

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避免拋出一個異常,如果沒有找到記錄。純粹是一個選擇的問題,但這意味着你在編碼時有這種可能性。