Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contagem de linhas em Doctrine 2


Se você estiver usando apenas o MySQL, poderá aproveitar seu FOUND_ROWS() função.

Isso exigirá o uso de consultas nativas, o que provavelmente prejudicará sua capacidade de usar um banco de dados diferente do MySQL, mas funciona muito bem na minha experiência.

Eu usei algo como o seguinte com grande sucesso.
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;
}

Depois de obter a matriz de resultados da função acima, extraio o elemento 'foundRows' para uma variável separada, desmarco-a (ou seja, unset($results['foundRows']) ) e continue usando a matriz normalmente.

Espero que isto ajude.