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

Antal rækker i doktrin 2

Hvis du kun vil bruge MySQL, så kan du drage fordel af dens FOUND_ROWS() funktion.

Dette vil kræve brug af native forespørgsler, hvilket højst sandsynligt vil hindre din evne til at bruge en anden DB end MySQL, men det fungerer ganske godt efter min erfaring.

Jeg har brugt noget som det følgende med stor succes.

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

Efter at have fået resultatarrayet fra ovenstående funktion, udtrækker jeg 'foundRows'-elementet til en separat variabel, deaktiverer det (dvs. unset($results['foundRows']) ), og fortsæt derefter med at bruge arrayet som normalt.

Håber dette hjælper.




  1. SQL INSERT for begyndere

  2. applikationen forbinder til databasen

  3. Sådan forbinder du GraphQL og PostgreSQL

  4. FEJL 1118 (42000) Rækkestørrelsen er for stor