2012-07-13 46 views
1

我試圖從表中檢索評論有ID,遊戲(外鍵)和日期的評論。在學說2中的行數

每次我徵求意見時,我都希望得到3條評論按指定遊戲的日期排序,並且我想知道是否有更多評論可供稍後顯示。對於這一點,我已經寫了兩個功能,第一個返回的三點意見:

public function getRecentComments($offset,$id) { 
    $dql = "SELECT c FROM Comment c 
     WHERE c.game = ?1 
     ORDER BY c.date DESC"; 
    $query = $this->getEntityManager()-> 
     createQuery($dql)-> 
     setParameter(1, (int)$id)->  
     setMaxResults(3)-> 
     setFirstResult($offset); 
    return $query->getResult(); 

,第二個返回後,我能獲得的評論數。這個功能的原因是我們還會顯示一個按鈕「更多評論」或沒有。這是第二個功能:

public function moreComments($offset,$id) { 

    $dql = "SELECT COUNT(c.id) FROM Comment c 
     WHERE c.game = ?1 
     ORDER BY c.date DESC"; 
    $query = $this->getEntityManager() 
     ->createQuery($dql) 
     ->setParameter(1, (int)$idPartido) 
     ->setFirstResult($offset+3)  
     ->setMaxResults(1) 
     ->getSingleScalarResult(); 

    return $query; 
} 

但第二個功能不會在接下來的工作錯誤:

致命錯誤:未捕獲的異常「學說\ ORM \ NoResultException」有消息「沒有結果發現儘管至少有一行是預期的。

我認爲這是由於使用setFirstResult和count()。

所以,我用

public function moreComments($offset,$id) { 

    $dql = "SELECT c FROM Comentario c 
     WHERE c.partido = ?1 
     ORDER BY c.fecha DESC"; 
    $query = $this->getEntityManager() 
     ->createQuery($dql) 
     ->setParameter(1, (int)$idPartido) 
     ->setFirstResult($offset+3)  
     ->setMaxResults(1) 
     ->getSingleScalarResult(); 

    return sizeof($query); 
} 

這顯然是爛筆頭,因爲我不應該得到的數據只是一個計數。我怎樣才能正確地編寫第二個函數?

在此先感謝。

回答

3

如果你只使用MySQL,那麼你可以利用它的FOUND_ROWS()函數。

這將需要使用原生查詢,這很可能會妨礙您使用除MySQL以外的數據庫的能力,但根據我的經驗,它工作得很好。

我已經使用了以下類似的東西,並取得了巨大的成功。

use Doctrine\ORM\Query\ResultSetMapping; 

public function getRecentComments($offset, $id) { 
    $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM Comment c 
     WHERE c.game = ? 
     ORDER BY c.date DESC 
     LIMIT ?,3"; 
    $rsm = new ResultSetMapping(); 
    $rsm->addEntityResult('Comment', 'c'); 
    $rsm->addFieldResult('c', 'id', 'id'); 
    $rsm->addFieldResult('c', 'game_id', 'game_id'); 
    $rsm->addFieldResult('c', 'date', 'date'); 
    $query = $this->getEntityManager()->createNativeQuery($dql, $rsm); 
    $query->setParameters(array(
     (int)$id, 
     (int)$offset 
    )); 
    $results = $query->getResult(); 

    // Run FOUND_ROWS query and add to results array 
    $sql = 'SELECT FOUND_ROWS() AS foundRows'; 
    $rsm = new ResultSetMapping(); 
    $rsm->addScalarResult('foundRows', 'foundRows'); 
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
    $foundRows = $query->getResult(); 
    $results['foundRows'] = $foundRows[0]['foundRows']; 

    return $results; 
} 

從上述功能得到結果陣列後,我提取「foundRows」元素到一個單獨的變量,它未設置(即,unset($results['foundRows'])),然後繼續使用該陣列爲正常。

希望這會有所幫助。

+0

我真的很感謝你的回答。這對我幫助很大。不過,我很快就會使用postgresql。 – honnix 2012-07-14 21:37:48

+2

我認爲你可以使用你現有的第二個查詢,但用'getScalarResult()'替換'getSingleScalarResult()'。或者在try/catch塊中包裝你的第二個查詢來捕獲異常;如果拋出異常,那麼你知道沒有更多的註釋。 – rexmac 2012-07-14 22:34:29