sql >> Base de Datos >  >> RDS >> Mysql

Conteo de filas en Doctrine 2

Si solo usará MySQL, entonces puede aprovechar su FOUND_ROWS() función.

Esto requerirá el uso de consultas nativas, lo que probablemente dificultará su capacidad para usar una base de datos que no sea MySQL, pero en mi experiencia funciona bastante bien.

He usado algo como lo siguiente con gran éxito.

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

Después de obtener la matriz de resultados de la función anterior, extraigo el elemento 'foundRows' en una variable separada, lo anulo (es decir, unset($results['foundRows']) ), y luego continúe usando la matriz normalmente.

Espero que esto ayude.