Mysql
 sql >> Database >  >> RDS >> Mysql

Conteggio delle righe in Dottrina 2

Se utilizzerai solo MySQL, puoi sfruttare i suoi FOUND_ROWS() funzione.

Ciò richiederà l'utilizzo di query native, che molto probabilmente ostacoleranno la tua capacità di utilizzare un DB diverso da MySQL, ma secondo la mia esperienza funziona abbastanza bene.

Ho usato qualcosa come il seguente con grande successo.

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

Dopo aver ottenuto l'array dei risultati dalla funzione sopra, estraggo l'elemento 'foundRows' in una variabile separata, lo deset (cioè, unset($results['foundRows']) ), quindi continuare a utilizzare l'array normalmente.

Spero che questo aiuti.