Количество строк в Доктрине 2

Я пытаюсь получить комментарии из таблицы Комментарий, который имеет идентификатор, игру (внешний ключ) и дату.

Каждый раз, когда я запрашиваю комментарии, я хочу получить 3 комментария, отсортированные по дате для указанной игры, и я хочу знать, есть ли больше комментариев для показа позже. Для этого я написал две функции, первая возвращает три комментария:

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(); 

И второе возвращает количество комментариев, которые я мог бы получить позже. Причиной этой функции является показ кнопки «Дополнительные комментарии» или нет. Это вторая функция:

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

Но вторая функция не работает для следующей ошибки:

Неустранимая ошибка: Не удалось исключить «Doctrine \ ORM \ NoResultException» с сообщением «Результат запроса не найден, хотя ожидалась хотя бы одна строка.

Я думаю, что это связано с использованием setFirstResult и count ().

Итак, я использовал

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

Который явно плохо написан, потому что я не должен получать данные только за счет. Как я мог написать вторую функцию правильно?

Заранее спасибо.

Solutions Collecting From Web of "Количество строк в Доктрине 2"

Если вы будете использовать MySQL только тогда, вы можете воспользоваться FOUND_ROWS() .

Это потребует использования собственных запросов, которые, скорее всего, будут препятствовать вашей возможности использовать базу данных, отличную от MySQL, но она отлично работает в моем опыте.

Я с большим успехом использовал что-то вроде следующего.

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

После получения массива результатов из вышеприведенной функции я извлекаю элемент «foundRows» в отдельную переменную, отключая ее (т. unset($results['foundRows']) ), а затем продолжайте использовать массив как обычно.

Надеюсь это поможет.