当我使用 orderBy 时,Doctrine QueryBuilder 会削减结果

Doctrine QueryBuilder cuts the result when I use orderBy

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

QB Code

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

Scenario 1: QueryBuilder with orderBy and database

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

Scenario 2: QueryBuilder with out orderBy and database

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

DB: 在这种情况下,结果符合预期 10 条记录

这种情况下唯一的问题是我无法使用 QB 对结果进行排序。

Environment description

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

没有异常,错过配置只会在我使用 orderBy 时削减结果

来自将此作为答案发布的评论


我猜是因为你是通过左连接 selecting 相关实体,所以你会得到每个主要实体的多个结果(由于一对多的关系)但不是以排序的方式但是当你这样做时在您的结果集上排序,重复项显示在同一行中,在没有排序的情况下,重复项仍然存在,但与未排序的结果不在同一行中,因此您没有 noticed/considered 它们作为重复记录。

我认为你的案例的解决方法是 select 只有你的主要实体让查询构建器中的 A 不要 select 相关的 addSelect(...) 并使用 lazy loading 当您想要显示相关实体的所需结果时。