2012-04-06 16 views
3

Doctrine 2のエンティティアソシエーションマッピングから得られた結果をページ付けするにはどうすればよいですか?例えばアソシエーションマッピングを使用した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(
    //.... 
+0

私はここでまったく同じような状況を抱えているが、カスタムページネータクラスで動作するように欲求と私はページネータ優しいDQLクエリを配る私のエンティティのリポジトリにメソッドを追加しました。 – Brock

答えて

4

EXTRA_LAZYフェッチモードを使用すると、Doctrineはコレクションの水分補給時にすべてのオブジェクトを取得しません。コレクションでslice()メソッドを使用するときに必要なサブセットのみを取得します。

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

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

これは改ページとの相互作用を確認する必要があります。

+0

ありがとうルイフィリップ。私は余分な怠惰なアソシエーションについて知りませんでした。そして、彼らはうまく行く道だと思っています。 QueryとQueryBuilderオブジェクトのためのボックスのページングがあるので、私はカスタムアダプターの作成を見なければならないかもしれません。 – dianovich

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); 
関連する問題