sql >> Databasteknik >  >> RDS >> Mysql

Antal rader i Doktrin 2

Om du bara kommer att använda MySQL kan du dra fördel av dess FOUND_ROWS() funktion.

Detta kommer att kräva att du använder inbyggda frågor, vilket med största sannolikhet kommer att hindra din förmåga att använda en annan DB än MySQL, men det fungerar ganska bra enligt min erfarenhet.

Jag har använt något i stil med följande med stor framgång.

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 att ha hämtat resultatmatrisen från funktionen ovan extraherar jag elementet 'foundRows' till en separat variabel, avaktiverar det (dvs unset($results['foundRows']) ), och fortsätt sedan att använda arrayen som vanligt.

Hoppas detta hjälper.




  1. Hur man inaktiverar alla CHECK &främmande nyckelbegränsningar för en tabell i SQL Server (T-SQL-exempel)

  2. Simulera group_concat MySQL-funktion i Microsoft SQL Server 2005?

  3. Hur implementerar man en-till-en-, en-till-många- och många-till-många-relationer samtidigt som man designar tabeller?

  4. mysql får last_insert_id() i en trigger