Nếu bạn chỉ sử dụng MySQL, thì bạn có thể tận dụng lợi thế của FOUND_ROWS()
chức năng.
Điều này sẽ yêu cầu sử dụng các truy vấn gốc, điều này rất có thể sẽ cản trở khả năng sử dụng DB khác với MySQL của bạn, nhưng theo kinh nghiệm của tôi thì nó hoạt động khá tốt.
Tôi đã sử dụng một cái gì đó như sau và rất thành công.
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;
}
Sau khi lấy mảng kết quả từ hàm trên, tôi trích xuất phần tử 'foundRows' thành một biến riêng biệt, bỏ đặt nó (tức là unset($results['foundRows'])
), và sau đó tiếp tục sử dụng mảng như bình thường.
Hy vọng điều này sẽ hữu ích.