2011-08-04 1 views
20

나는 열심히로드하고 싶은 다른 엔티티와 다른 게으른 (또는 게으른)로드를 가지고있다.Doctrine 2에서 Fetch Mode (Eager/Lazy 등)를 런타임에 변경할 수 있습니까?

내 매핑에 내 YAML에서 선언 된 패치 모드가 없으므로 기본값 (지연로드)을 사용합니다.

현재 열심히로드하는 유일한 방법은 수동으로 DQL을 작성하는 것입니다. 새 항목을 추가 할 때마다이를 업데이트해야합니다.

이상적으로는 루트 엔티티와 모든 관련 객체를로드하는 힘을로드하는 것이 이상적입니다. 내가 이것을 할 수있는 방법이 있습니까?

왜 그렇지 않은가? (구현되지 않은 기능이 아닌 이유가 있습니까?) 그렇지 않다면?

답변

20

내장 된 저장소 메소드 (find(), findAll())를 사용하려면 주석에 열심히로드하지 않는 한 운이 좋을 것입니다.

일부 사용자 지정 리포지토리의 메서드에서 쿼리 작성기 (또는 원시 DQL)를 사용하여 원하는 위치로 열심히로드 할 수 있습니다. 예, 엔티티를 추가 할 때 해당 메소드를 업데이트해야하지만 적어도 지연/열망하는로드와 관련하여 항상 어떤 일이 발생하는지 파악할 수 있으므로 한 곳에서 전체를 유지 관리하면됩니다.

find() 등의 $ eagerLoad 플래그가없는 이유는 간단한 작업을위한 편리한 메소드이기 때문입니다. 그러한 플래그를 추가하고 싶다면 재귀 적 열심히로드를 심도별로 제한하려는 상황에 신속하게 도달해야합니다. 순환 참조 (예 : 모든 양방향 연관)에 대해 걱정해야 할 것입니다.

+0

응답 해 주셔서 감사합니다. 의견을 제시하고자하는 다른 사람이있는 경우 잠시 질문을 드리겠습니다. – calumbrodie

+2

'addSelect ('alias')'에 조인 된 테이블 별칭을 모두 추가하여 결과에 관련 엔터티를 포함해야합니다. – juanmf

21

setFetchMode() DQL의 방법을 사용하여 모드를 설정할 수 있습니다. 문서를 참조하십시오 : http://readthedocs.org/docs/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#temporarily-change-fetch-mode-in-dql

+2

many-to-one 및 one-to-one 연관에서만 사용할 수 있습니다. – murtho

+4

방금 ​​2 시간을 잃어 버렸기 때문에 setFetchMode에서 첫 번째 매개 변수는 현재 클래스를 참조해야하며 게으르고 열정적으로 가져 오는 클래스는 참조하지 않아야합니다 . 그리고 클래스는 AppBundle \ Entity \ Student (예와 같이 표시)와 같이 표시되어야합니다. –

+0

2 시간? 2 일 동안 날 카운트 해! Symfony가 얼마나 성가신 지 미안합니다 :/ – Sliq

관련 문제