0

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

对于 Dojo jsonRest,服务器的响应必须有一个包含结果偏移量限制记录总数(无限制)的标头Content-Range

因此,对于带有Content-Range: items 0-24/66标头的响应,如果用户将网格记录滚动到第24 行,它将发出带有Range: 24-66标头的异步请求,然后是响应标头应该有一个Content-Range: items 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();
}
4

2 回答 2

1

如果你使用 MySQL,你可以做一个SELECT FOUND_ROWS().

文档中。

一个 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();
于 2012-04-21T04:24:41.437 回答
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();
于 2012-05-14T16:38:43.867 回答