Doctrine2 OFFSET和LIMIT

时间:2013-02-25 18:27:03

标签: symfony doctrine-orm

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

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

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

1 个答案:

答案 0 :(得分:7)

您可能是DQL中fetch-joining时遇到的典型问题。这是一个非常简单的问题,并且源于这样的事实:偏移和限制应用于尚未水合的结果集,并且必须进行标准化(参见documentation about first and max results about that)。

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

  1. 根据您的偏移量/限制
  2. 计算结果集中的记录数
  3. 计算查询的根实体的不同标识符(使用应用的max / first结果)
  4. 检索已连接的结果(未应用第一个/最多结果)
  5. 它的用法非常简单:

    $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来了解如何直接处理。