Я пытаюсь получить комментарии из таблицы Комментарий, который имеет идентификатор, игру (внешний ключ) и дату.
Каждый раз, когда я запрашиваю комментарии, я хочу получить 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); }
Который явно плохо написан, потому что я не должен получать данные только за счет. Как я мог написать вторую функцию правильно?
Заранее спасибо.
Если вы будете использовать 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'])
), а затем продолжайте использовать массив как обычно.
Надеюсь это поможет.