Mysql
 sql >> Base de données >  >> RDS >> Mysql

Nombre de lignes dans Doctrine 2

Si vous utilisez uniquement MySQL, vous pouvez profiter de son FOUND_ROWS() fonction.

Cela nécessitera l'utilisation de requêtes natives, ce qui entravera très probablement votre capacité à utiliser une base de données autre que MySQL, mais cela fonctionne assez bien d'après mon expérience.

J'ai utilisé quelque chose comme ce qui suit avec beaucoup de succès.

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

Après avoir obtenu le tableau de résultats de la fonction ci-dessus, j'extrait l'élément 'foundRows' dans une variable distincte, je la supprime (c'est-à-dire unset($results['foundRows']) ), puis continuez à utiliser le tableau normalement.

J'espère que cela vous aidera.