2017-09-06 10 views
0

우리는 Silex와 Doctrine (ODM)을 사용하여 API를 개발 중이며 images 속성을 가진 Story 개체가 있습니다.ODM Doctrine에 대한 지연로드를 비활성화 할 수 있습니까?

우리는 (다른 모든 저장소를 확장하는) AbstractRepository의 저장소에 메소드를 가져 왔습니다.

public function get(string $documentId) : array 
{ 
    $document = $this->createQueryBuilder() 
     ->field('id')->equals($documentId) 
     ->hydrate(false) 
     ->getQuery() 
     ->toArray(); 
} 

이 방법 객체 임베디드 및 참조 반환하지만 referenceMany 반환 데이터가없는 ID 만합니다.

모든 문서를 가져 오기 위해 지연로드를 거부 할 수 있습니까?

가능한 해결책은 재 작성 방법 toArray입니다.

+0

확인합니다. 원하는 객체를 select 절에 추가하기 만하면됩니다. 많은 예제. odm과 함께 쿼리 빌더를 사용하지 않았지만 작동한다고 가정합니다. 그리고 저는 추상적 인 것들에 대해 확신하지 못합니다. – Cerad

+0

@Cerad Doctrine 사이트에서 발견했기 때문에 예제를 제공해 주시겠습니까 'ReferenceMany 문서는 선택한 전략에 관계없이 지연로드를 허용하기 위해 항상 컬렉션으로 처리됩니다. ' – yAnTar

+0

위시하지만 실제로는 할 수 없습니다. ODM 테스트 케이스가 있습니다. 나는 select ('story', 'image')가 트릭을 할 것이라고 생각하지만 실제로는 모른다. 그리고 스토리와 이미지에 명시 적으로 참여해야 할 수도 있습니다. – Cerad

답변

0

->hydrate(false)을 사용하자마자 ODM에 명령을 내리고 MongoDB에서 원시 데이터를 반환하도록 지시합니다. referenceMany은 ID의 배열로서 원시 표현이므로 지연로드가 관련되어 있지 않습니다.

문제가 참조 된 이미지를 얻기 위해 추가 쿼리를 해고 StoryRepository를 구현하는 것입니다 해결하는 가장 깨끗한 방법 :

public function get(string $documentId) : array 
{ 
    $document = $this->createQueryBuilder() 
     ->field('id')->equals($documentId) 
     ->hydrate(false) 
     ->getQuery() 
     ->toArray(); 
    $document['images'] = /* ... */; 
    return $document; 
} 
+0

네,이 방법에 대해서 알고 있습니다. 왜 나는 그것을 좋아하지 않습니다. 왜냐하면 모든 저장소 (지금은 그다지 없지만, 미래에는 가능합니다)에 대해 ReferenceMany 관계가있는 저장소를 작성해야하기 때문입니다. 나는 Doctrine이 해결책을 제공한다고 생각했다. – yAnTar

+0

글쎄요, 컬렉션이있는 상자에서 꺼내지 만, 원시 데이터를 요청하지 않으면 특별히 말하고있는 것입니다. – malarzm