教条2与关联映射的分页

时间:2012-04-06 12:37:56

标签: zend-framework orm doctrine doctrine-orm associations

我想知道如何对从Doctrine 2中的实体关联映射中获得的结果进行分页?例如

class Customer {
  /**
   * @OneToMany(targetEntity="Order")
   */
  private $orders;
}

可以这样使用:

$customer->getOrders();

将返回Order个对象的集合。

问题是当有大量订单对象时。

我们可以在构建自定义查询时使用Doctrine\ORM\Tools\Pagination\Paginator,但是在使用关联映射时,我没有看到任何方法可以挂钩查询生成。

class Paginator {
  /** 
   * @param Query|QueryBuilder $query A Doctrine ORM query or query builder. 
   */
  function __construct(
    //....

2 个答案:

答案 0 :(得分:5)

如果您使用EXTRA_LAZY提取模式,则Doctrine在保湿系列时不会检索所有对象。它只会检索在集合上使用slice()方法时所需的子集。

class Customer {
    /**
     * @OneToMany(targetEntity="Order", fetch="EXTRA_LAZY")
     */
    private $orders;
}

$cust = new Customer;
$orders = $cust->getOrders()->slice(100, 50);

您需要验证它与分页的交互方式。

答案 1 :(得分:0)

集合具有过滤API,允许从集合中分割部分数据。如果尚未从数据库加载集合,则过滤API可以在SQL级别上工作,以便对大型集合进行优化访问。 Doctrine Filtering Collections

class Customer {
  /**
   * @OneToMany(targetEntity="Order")
   */
  private $orders;

  public function getOrders($offset = 0, $limit = 30){

    $criteria = Criteria::create()
                ->setFirstResult($offset)
                ->setMaxResults($limit);

    return $this->orders->matching($criteria);

  }

}

$cust = new Customer;
$orders = $cust->getOrders(50, 100);