我想在查询中使用limit和offset,但返回的记录数不匹配。当我没有使用偏移和限制函数获得26个对象,并在设置方法
之后->setMaxResults(5)
->setFirstResult(10)
数字是1 ... 发生了什么事?
答案 0 :(得分:7)
您可能是DQL中fetch-joining时遇到的典型问题。这是一个非常简单的问题,并且源于这样的事实:偏移和限制应用于尚未水合的结果集,并且必须进行标准化(参见documentation about first and max results about that)。
如果您想避免此问题(即使使用更复杂的联接或获取结果),您还需要使用ORM DQL Paginator API。使用paginator基本上会触发多个查询:
它的用法非常简单:
$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个项目,无论加入或获取加入结果的数量如何。
虽然这可能看起来效果不佳,但它是处理联接结果问题最安全的方法,导致明显的混乱偏移和结果限制。您可以通过深入了解internals of the ORM Paginator来了解如何直接处理。