Doctrine 2关联映射分页

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

我在这里遇到了完全相同的情况,但是我没有想要在自定义Paginator类上工作,我只是向我的实体存储库添加了方法,以提供Paginator友好的DQL查询。 - Brock
2个回答

7
如果你使用 EXTRA_LAZY 拉取模式,Doctrine 在为集合进行水化时不会检索所有对象。只有在你在集合上使用 slice() 方法时,它才会检索所需的子集。
class Customer {
    /**
     * @OneToMany(targetEntity="Order", fetch="EXTRA_LAZY")
     */
    private $orders;
}

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

你需要验证这与分页的交互方式。

谢谢Louis-Philippe。我不知道extra lazy关联,认为它们可能是正确的方法。对于Query和QueryBuilder对象,分页已经可以直接使用,所以我可能需要考虑编写自定义适配器。 - dianovich
如果集合过滤器能够了解一些SQL/DQL,那就太好了,这样您就可以为记录准备过滤器,然后用切片获取它们。(当前的collection->slice()会获取所有数据) - jave.web
希望收集过滤器能够了解一些SQL/DQL,这样你就可以为记录准备过滤器,然后用切片方式获取它们。(当前的收集->切片()会获取所有数据) - jave.web

0

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

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接