1

我想在查询中使用限制和偏移量,但返回的记录数不匹配。当我不使用 offset 和 limit 函数时,得到 26 个对象,并且在设置方法之后

->setMaxResults(5)
->setFirstResult(10)

数字是 1 ... 发生了什么事?

4

1 回答 1

7

您可能是在 DQL 中fetch-joining时遇到的典型问题。这是一个非常简单的问题,源于偏移和限制应用于尚未水合且必须归一化的结果集的事实(请参阅有关第一和最大结果的文档)。

如果你想避免这个问题(即使是更复杂的连接或获取连接的结果),你将需要使用ORM DQL Paginator API。使用分页器基本上会触发多个查询:

  1. 根据您的偏移量/限制计算结果集中的记录数
  2. 计算查询的根实体的不同标识符(应用最大/第一个结果)
  3. 检索连接结果(不应用第一个/最大结果)

它的用法很简单:

$query = $em->crateQuery($fetchJoinQuery);

$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query);

$query->setFirstResult(20);
$query->setMaxResults(100);

foreach ($paginator as $result) {
    var_dump($result->getId());
}

这将打印从偏移量 20 处的项目开始的 100 个项目,无论连接或 fetch-joined 结果的数量如何。

虽然这可能看起来效果不佳,但它是处理 fetch-joined 结果问题的最安全方法,这会导致明显的偏移量和结果限制。您可以通过深入了解ORM Paginator 的内部结构来了解如何直接处理此问题。

于 2013-02-25T22:30:44.757 回答