Om du bara kommer att använda MySQL kan du dra fördel av dess FOUND_ROWS()
funktion.
Detta kommer att kräva att du använder inbyggda frågor, vilket med största sannolikhet kommer att hindra din förmåga att använda en annan DB än MySQL, men det fungerar ganska bra enligt min erfarenhet.
Jag har använt något i stil med följande med stor framgå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;
}
Efter att ha hämtat resultatmatrisen från funktionen ovan extraherar jag elementet 'foundRows' till en separat variabel, avaktiverar det (dvs unset($results['foundRows'])
), och fortsätt sedan att använda arrayen som vanligt.
Hoppas detta hjälper.