Doctrine 2中的行数

时间:2012-07-13 20:21:24

标签: php mysql doctrine-orm

我正在尝试从表中检索注释,其中包含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);
}

这显然是不好写的,因为我不应该只获取计数数据。我怎样才能正确编写第二个函数?

提前致谢。

1 个答案:

答案 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'])),然后继续正常使用该数组。

希望这有帮助。