Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Anzahl der Zeilen in Lehre 2

Wenn Sie nur MySQL verwenden, können Sie dessen FOUND_ROWS() Funktion.

Dies erfordert die Verwendung nativer Abfragen, was Sie höchstwahrscheinlich daran hindern wird, eine andere DB als MySQL zu verwenden, aber meiner Erfahrung nach funktioniert es recht gut.

Ich habe etwas wie das Folgende mit großem Erfolg verwendet.

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

Nachdem ich das Ergebnisarray aus der obigen Funktion erhalten habe, extrahiere ich das Element „foundRows“ in eine separate Variable und setze es zurück (d. h. unset($results['foundRows']) ), und verwenden Sie das Array dann wie gewohnt weiter.

Hoffe das hilft.