我想在查询中使用限制和偏移量,但返回的记录数不匹配。当我不使用 offset 和 limit 函数时,得到 26 个对象,并且在设置方法之后
->setMaxResults(5)
->setFirstResult(10)
数字是 1 ... 发生了什么事?
我想在查询中使用限制和偏移量,但返回的记录数不匹配。当我不使用 offset 和 limit 函数时,得到 26 个对象,并且在设置方法之后
->setMaxResults(5)
->setFirstResult(10)
数字是 1 ... 发生了什么事?
您可能是在 DQL 中fetch-joining时遇到的典型问题。这是一个非常简单的问题,源于偏移和限制应用于尚未水合且必须归一化的结果集的事实(请参阅有关第一和最大结果的文档)。
如果你想避免这个问题(即使是更复杂的连接或获取连接的结果),你将需要使用ORM DQL Paginator API。使用分页器基本上会触发多个查询:
它的用法很简单:
$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 的内部结构来了解如何直接处理此问题。