我试图从一个表注释中检索注释,这个表注释有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/

10-11 12:43