symfony groupby 分页 计算count

sanlanlan 2018-9-4 标签: mysql 浏览:1417 评论: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 去操作。




本文相关标签: php mysql symfony groupby

发表评论: