2012-04-06 8 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);