【问题标题】:Doctrine 2 Pagination with Association MappingDoctrine 2 使用关联映射进行分页
【发布时间】:2012-04-06 12:37:55
【问题描述】:

我想知道如何对从 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 查询。

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢路易斯-菲利普。我不知道 extra lazy 关联,并认为它们很可能是要走的路。 Query 和 QueryBuilder 对象具有开箱即用的分页功能,因此我可能不得不考虑编写自定义适配器。
【解决方案2】:

集合有一个过滤 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);

【讨论】:

    猜你喜欢
    • 2016-01-26
    • 2018-09-21
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多