Doctrine2 OFFSET和LIMIT

lee*_*ake 1 symfony doctrine-orm

我想在查询中使用limit和offset,但返回的记录数不匹配.当我没有使用偏移和限制函数获取26个对象,并在设置方法后

->setMaxResults(5)
->setFirstResult(10)
Run Code Online (Sandbox Code Playgroud)

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

Ocr*_*ius 7

您可能是在DQL中获取加入时遇到的典型问题.这是一个非常简单的问题,并且源于这样的事实:偏移和限制应用于尚未补充的结果集并且必须进行标准化(请参阅有关该结果的第一个和最大结果文档).

如果要避免此问题(即使使用更复杂的联接或联接结果),您将需要使用ORM DQL Paginator API.使用paginator基本上会触发多个查询:

  1. 根据您的偏移/限制计算结果集中的记录数
  2. 计算查询的根实体的不同标识符(使用应用的max/first结果)
  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());
}
Run Code Online (Sandbox Code Playgroud)

这将从偏移量为20的那一个开始打印100个项目,而不管连接或取结合结果的数量.

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