symfony groupby 分页 计算count
sanlanlan 2018-9-4 标签: mysql 浏览:2147 评论:0
symfony中经常使用 KnpBundles 来进行分页
但是,symfony 如果数据库使用的是 ORM ,分页的时候,如果是group by 那么KnpBudle 计算出来的count 还是原来为group by 的数量。
要解决这个问题是自己重写一个计算count的方法。
还有一个方法是使用 QueryBuilder 来进行计算。
public function items(ItemsEvent $event)
{
if ($event->target instanceof QueryBuilder) {
/** @var $target QueryBuilder */
$target = $event->target;
// count results
$qb = clone $target;
//reset count orderBy since it can break query and slow it down
$qb
->resetQueryPart('orderBy')
;
// get the query
$sql = $qb->getSQL();
$qb
->resetQueryParts()
->select('count(*) as cnt')
->from('(' . $sql . ')', 'dbal_count_tbl')
;
$event->count = $qb
->execute()
->fetchColumn(0)
;
// if there is results
$event->items = array();
if ($event->count){
$qb = clone $target;
$qb
->setFirstResult($event->getOffset())
->setMaxResults($event->getLimit())
;
$event->items = $qb
->execute()
->fetchAll()
;
}
$event->stopPropagation();
}
}
这是KnpBundle 源码的一种解决方式
换成自己的解决方法就是:
protected function count($selects, $where, $groupBy)
{
$sql = $this->em->getConnection()->createQueryBuilder()
->select($selects)
->from('table1', 't1')
->leftJoin('t1','table2','t2','t1.id = t2.p_id')
->where($where)
->groupBy($groupBy);
$count = $this->em->getConnection()->createQueryBuilder()
->select('count(*) as cnt')
->from('(' . $sql . ')', 'dbal_count_tbl')
->execute()
->fetchColumn(0);
return $count ? :0;
}
这边要注意,其实sql d的原理就是
select count(*) from (select id from table where id = 1) t //todoselect count(*) as cnt
from (select user_id,t_id from table group by user_id,t_id) t
//5.7版本,使用groupby 必须是: group by 字段对应 select 字段
其实是使用原生PDO 去查询的,所以要注意安全问题。
如果要更好的方式,不建议这样使用SQL 去操作。
发表评论: