有限结果的总计数

时间:2012-04-13 15:09:32

标签: dojo symfony doctrine-orm

所以我实现了dojo.store.jsonRest的分页,以便在dojox.grid.DataGrid中用作存储。在使用 Symfony 2 和ORM Doctrine 的服务器中,我是这两个框架的新手。

对于Dojo jsonRest,服务器的响应必须包含标题 Content-Range ,其中包含偏移限制的结果记录总数(没有限制)

因此对于具有内容范围:项目0-24 / 66 标题的回复,如果用户将网格记录滚动到 24行,则将使用范围:24-66 标头发出异步请求,然后响应标头应包含内容范围:项目24-66 / 66 。这样做是因为Dojo可以知道它可以为分页数据提出多少请求以及所呈现和后续请求的记录范围。

所以我的问题是,要获得没有限制的记录总数,我必须使用具有偏移和限制的相同查询进行 COUNT 查询。我不喜欢这个。

我想知道是否有办法可以在不进行两次查询的情况下获得总计数和有限的结果。

public function getByTextCount($text)
{
    $dql = "SELECT COUNT(s.id) FROM Bundle:Something s WHERE s.text LIKE :text";

    $query = $this->getEntityManager()->createQuery($dql);
    $query->setParameter('text', '%'.$text.'%');

    return $query->getSingleScalarResult();
}

-

public function getByText($text, $offset=0, $limit=24)
{
    $dql = "SELECT r FROM Bundle:Something s WHERE s.text LIKE :text";

    $query = $this->getEntityManager()->createQuery($dql);
    $query->setParameter('text', '%'.$text.'%');
    $query->setFirstResult($offset);
    $query->setMaxResults($limit);

    return $query->getArrayResult();
}

2 个答案:

答案 0 :(得分:1)

如果您使用的是MySQL,则可以执行SELECT FOUND_ROWS()

来自documentation

  

SELECT语句可能包含LIMIT子句以限制该数字   服务器返回到客户端的行数。在某些情况下,它是   希望知道该语句将返回多少行   没有LIMIT,但没有再次运行语句。获得   此行计数,在SELECT中包含SQL_CALC_FOUND_ROWS选项   声明,然后调用FOUND_ROWS():

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

答案 1 :(得分:0)

如果您只想使用Doctrine(即避免特定于供应商的SQL),您可以在选择实体后重置部分查询:

    // $qb is a Doctrine Query Builder
    // $query is the actual DQL query returned from $qb->getQuery()
    // and then updated with the ->setFirstResult(OFFSET) and ->setMaxResults(LIMIT)

    // Get the entities as an array ready for JSON serialization
    $entities = $query->getArrayResult();

    // Reset the query and get the total records ready for the Range header
    // 'e' in count(e) is the alias for the entity specified in the Query Builder
    $count = $qb->resetDQLPart('orderBy')
                ->select('COUNT(e)')
                ->getQuery()
                ->getSingleScalarResult();
相关问题