当我使用orderBy

时间:2018-06-12 20:45:47

标签: postgresql symfony doctrine-orm query-builder symfony-3.4

我有一个大型存储库方法,它会在后端生成一个常规查询,我传递给该存储库方法的一些参数是最大结果,第一个结果,按顺序排序和按顺序排序,以便控制要显示的记录总数,分页和记录的顺序。问题是当我在某些配置中时(第4页,最大结果:10,第一结果:40),这应该给我数据库中+1000条记录的第40到第50条记录,但只返回-10条记录来自+1000条记录。

  

QB代码

....
return $total ? //this is a bool parameter to find out if I want the records or the records amount
                $qb
                    ->select($qb->expr()->count('ec.id'))
                    ->getQuery()->getSingleScalarResult() :
                $qb//these are the related entities all are joined by leftJoin of QB
                    ->addSelect('c')
                    ->addSelect('e')
                    ->addSelect('pr')
                    ->addSelect('cl')
                    ->addSelect('ap')
                    ->addSelect('com')
                    ->addSelect('cor')
                    ->addSelect('nav')
                    ->addSelect('pais')
                    ->addSelect('tarifas')
                    ->addSelect('transitario')
                    ->orderBy(isset($options['sortBy']) ? $options['sortBy'] : 'e.bl', isset($options['sortDir']) ? $options['sortDir'] : 'asc')
                    ->getQuery()
                    ->setMaxResults(isset($options['limit']) ? $options['limit'] : 10)
                    ->setFirstResult(isset($options['offset']) ? $options['offset'] : 0)
                    ->getArrayResult();
  

场景1:带有orderBy和数据库

的QueryBuilder

QB:在这种情况下,结果只有一个具有预期数据的实体,但当存在超过1000条记录时,只有一个实体不是10 DB:在这种情况下,我获得了10条记录但是具有相同的实体(来自QB的相同输出但重复了10次)

  

场景2:QueryBuilder没有orderBy和数据库

QB:在这种情况下,结果符合预期,从+1000条记录中过滤出10条记录

数据库:在这种情况下,结果是预期的10条记录

这种情况下唯一的问题是我无法使用QB订购我的结果。

  

环境描述

  • Symfony:3.4.11
  • PostgeSQL:9.2
  • PHP 7.2
  • 操作系统:Ubuntu Server 16.04 x64

为什么教义/ postgres给我这样的结果?

没有Exceptions,miss配置只会在我使用orderBy

时削减结果

提前致谢!

1 个答案:

答案 0 :(得分:1)

从评论中将其发布为答案


我猜是因为您是通过左联接选择相关实体的,所以每个主实体(由于一对多的关系)将获得多个结果,但不是以排序的方式,而是在结果集上进行排序时,重复项显示在同一行中,在没有排序的情况下,重复项仍然存在,但与未排序的结果不在同一行中,因此您没有注意到/将它们视为重复记录。

作为您的解决方案,我认为仅选择您的主要实体即可让查询构建器中的A不用选择相关的addSelect(...),而当您想从中显示所需的结果时使用lazy loading相关实体。