当我使用 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
- Symfony:3.4.11
- PostgeSQL: 9.2
- PHP 7.2
- OS: Ubuntu 服务器 16.04 x64
为什么 doctrine/postgres 给我这样的结果?
没有异常,错过配置只会在我使用 orderBy 时削减结果
来自将此作为答案发布的评论
我猜是因为你是通过左连接 selecting 相关实体,所以你会得到每个主要实体的多个结果(由于一对多的关系)但不是以排序的方式但是当你这样做时在您的结果集上排序,重复项显示在同一行中,在没有排序的情况下,重复项仍然存在,但与未排序的结果不在同一行中,因此您没有 noticed/considered 它们作为重复记录。
我认为你的案例的解决方法是 select 只有你的主要实体让查询构建器中的 A 不要 select 相关的 addSelect(...)
并使用 lazy loading 当您想要显示相关实体的所需结果时。
我有一个在后端生成常规查询的大型存储库方法,我传递给该存储库方法的一些参数是最大结果、第一个结果、排序依据和排序依据目录控制要显示的记录总数、分页和记录的顺序。问题是当我在某些配置例如(第 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
- Symfony:3.4.11
- PostgeSQL: 9.2
- PHP 7.2
- OS: Ubuntu 服务器 16.04 x64
为什么 doctrine/postgres 给我这样的结果?
没有异常,错过配置只会在我使用 orderBy 时削减结果
来自将此作为答案发布的评论
我猜是因为你是通过左连接 selecting 相关实体,所以你会得到每个主要实体的多个结果(由于一对多的关系)但不是以排序的方式但是当你这样做时在您的结果集上排序,重复项显示在同一行中,在没有排序的情况下,重复项仍然存在,但与未排序的结果不在同一行中,因此您没有 noticed/considered 它们作为重复记录。
我认为你的案例的解决方法是 select 只有你的主要实体让查询构建器中的 A 不要 select 相关的 addSelect(...)
并使用 lazy loading 当您想要显示相关实体的所需结果时。