2012-04-13 55 views
0

总数量,使得我实现分页为dojo.store.jsonRest作为dojox.grid.DataGrid商店使用。在使用Symfony的2和服务器IM作为ORM 主义,进出口新的这两个框架。在有限的结果

对于道场jsonRest服务器的响应必须包含结果报头内容范围偏移极限和记录的总数(不限制)

因此,对于具有一个内容范围的响应:项目0-24/66头,如果其中滚动栅格记录来的24行的用户,就会使与范围内的异步请求: 24-66标题,然后响应报头应该有一个内容范围:项目24-66/66。这样做是为了道场可以知道它有多少请求作出分页的数据和记录范围的介绍和后续请求。

所以我的问题是,要获得没有限制的记录总数,我必须使用具有偏移量和限制的相同查询进行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(); 
} 
+0

令人怀疑的是,虽然也许有人会知道。数据库几乎肯定会缓存整个查询,所以开销会很小。 – Cerad 2012-04-13 15:25:24

+0

我也这么认为,但会看到。感谢您的快速响应。 – Jmsegrev 2012-04-13 15:54:26

回答

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(); 
+0

谢谢,这正是我一直在寻找的! – Jmsegrev 2012-04-22 15:49:45

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();