Recuento de filas en Doctrine 2

Estoy tratando de recuperar los comentarios de una tabla Comentario que tiene identificación, juego (una clave externa) y fecha.

Cada vez que solicito comentarios quiero obtener 3 comentarios ordenados por fecha para un juego específico y quiero saber si hay más comentarios para mostrar más tarde. Para eso, he escrito dos funciones, la primera devuelve los tres comentarios:

public function getRecentComments($offset,$id) { $dql = "SELECT c FROM Comment c WHERE c.game = ?1 ORDER BY c.date DESC"; $query = $this->getEntityManager()-> createQuery($dql)-> setParameter(1, (int)$id)-> setMaxResults(3)-> setFirstResult($offset); return $query->getResult(); 

Y el segundo devuelve la cantidad de comentarios que podría obtener más tarde. El motivo de esta función es mostrar un botón “Más comentarios” o no. Esta es la segunda función:

 public function moreComments($offset,$id) { $dql = "SELECT COUNT(c.id) FROM Comment c WHERE c.game = ?1 ORDER BY c.date DESC"; $query = $this->getEntityManager() ->createQuery($dql) ->setParameter(1, (int)$idPartido) ->setFirstResult($offset+3) ->setMaxResults(1) ->getSingleScalarResult(); return $query; } 

Pero la segunda función no funciona para el próximo error:

Error fatal: excepción no detectada ‘Doctrine \ ORM \ NoResultException’ con el mensaje ‘No se encontró ningún resultado para la consulta aunque se esperaba al menos una fila.

Lo cual creo que es debido a usar setFirstResult y count ().

Entonces, he usado

 public function moreComments($offset,$id) { $dql = "SELECT c FROM Comentario c WHERE c.partido = ?1 ORDER BY c.fecha DESC"; $query = $this->getEntityManager() ->createQuery($dql) ->setParameter(1, (int)$idPartido) ->setFirstResult($offset+3) ->setMaxResults(1) ->getSingleScalarResult(); return sizeof($query); } 

Lo cual obviamente está mal escrito porque no debería obtener los datos solo por un conteo. ¿Cómo podría escribir la segunda función correctamente?

Gracias por adelantado.

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

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

He utilizado algo como el 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 desarmo (es decir, unset($results['foundRows']) ), y luego continúo usando la matriz de forma normal.

Espero que esto ayude.