我正在尝试从表中检索注释,其中包含id,游戏(外键)和日期。
每当我要求评论时,我想得到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);
}
这显然是不好写的,因为我不应该只获取计数数据。我怎样才能正确编写第二个函数?
提前致谢。
答案 0 :(得分:4)
如果您只使用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'])
),然后继续正常使用该数组。
希望这有帮助。