我试图从一个表注释中检索注释,这个表注释有id、game(外键)和date。
每次我要求评论,我想得到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\No result exception”,消息为“未找到查询结果,但至少需要一行。”。
我认为应该使用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以外的DB,但以我的经验来看,它工作得很好。
我成功地使用了如下的方法。
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;
}
从上面的函数中获取results数组后,我将“foundRows”元素提取到一个单独的变量中,取消设置(即
unset($results['foundRows'])
),然后继续正常使用该数组。希望这有帮助。
关于php - 教义2中的行数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11477814/