2012-05-18 5 views
2

Doctrine 2는 자동 JOIN 생성을 지원합니까? 즉Doctrine 2의 자동 JOIN 생성

$sellers = $entityManager->getRepository('Foo\Bar\Seller')->findBy(array('country' => 'US'), array('populate' => array('Product', 'Product.Category'))); 
foreach ($sellers as $seller) { 
    doStuffWith($seller->product->category); 
} 

교리 제품을 결합 할 것입니다 때문에 모든 것이 단일 쿼리를 취할 것이고, 같은 일을하고, 나는 종류가 각각 일부 제품 엔티티와 연관된 판매자의 실체를 가정입니다 카테고리 테이블을 판매자 테이블에 추가하고 결과를 사용하여 연관을 미리 채 웁니다. 이게 가능한가?

답변

3

당신은 가입 자동으로 두 가지 방법이 있습니다

  • 사용을 열망 가져 오는
  • 사용 DQL

열망 가져 오는 의미의 주요 개체를 가져올 때마다, 교리 2도 자동 것이다 "eager"로 표시된 릴레이션을 가져옵니다.

SELECT m, r FROM My\MainEntity m LEFT JOIN m.relatedEntity r

:이 작업은 주요 기업 및 관련 단체/기관 모두를 가져 오는 쿼리를 작성해야합니다, DQL와

(Manual: ManyToOne 참조) 매핑에 fetch 속성을 사용하여 수행됩니다 eager fetching vs DQL의 장점은 eager fetches를 사용하면 본질적으로 자동으로 그 기능을 얻을 수 있다는 것입니다. 그러나 eager fetching의 단점은 관련 엔터티를 실제로 사용하지 않으면 성능 저하가 발생할 수 있다는 것입니다. DQL을 사용하면 언제 가져올 것인지 제어 할 수 있습니다.

+0

DQL은 내가 자동으로 호출하는 것이 아닙니다. 열렬한 가져 오기가 유용 할 것입니다. (동적으로 활성화 할 수있을 것 같습니다 (http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily -change-fetch-mode-in-dql))하지만 이해할 수있는 한 많은 쿼리를 생성 할 것입니다. JOIN 대신 SELECT * FROM seller, SELECT * FROM 제품 어디에서 IN (...)'˙,'SELECT * FROM categories WHERE id IN (...)'여전히 다소 느리다. 또는 나는 오해가 무엇입니까? – Tgr

+0

열정적 인 가져 오기는 내가 아는 한 최대한 빨리 JOIN을 수행해야합니다. 왜 그런 IN 쿼리를 사용하는지 알지 못합니다. –

+0

고마워요! 이 솔루션 (관계에 대한 fetch = "EAGER")은 내 페이지 중 하나에서 쿼리 수를 111에서 9로 줄였습니다! 굉장한 솔루션. 절대 들어 본적이 없다. –

관련 문제