4

我想知道如何对从 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(
    //....
4

2 回答 2

6

如果您使用 EXTRA_LAZY 获取模式,Doctrine 将不会在水合集合时检索所有对象。它只会在您对集合使用 slice() 方法时检索所需的子集。

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

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

您需要验证它如何与分页交互。

于 2012-04-06T15:24:31.083 回答
0

集合有一个过滤 API,允许从集合中分割部分数据。如果集合尚未从数据库加载,过滤 API 可以在 SQL 级别上工作,以优化对大型集合的访问。学说过滤集合

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);
于 2017-04-08T11:27:02.857 回答