2011-04-11 3 views
25

블로그 게시물과 그 주석을 반환하는 교리 쿼리가 있습니다.가져 오기 - 조인 된 컬렉션으로 교리 쿼리를 제한 하시겠습니까?

SELECT b, c FROM BlogPost b LEFT JOIN b.comments c 

블로그 게시물 10 개로 결과를 제한하고 싶습니다. DQL 문서에 따르면 setMaxResults()은 콜렉션을 가져 오는 쿼리 (이 경우 주석)에 올바르게 작동하지 않습니다.

결과 제한을 지정하는 페치 조인 된 모음이 쿼리에 들어있는 경우 메서드는 다음과 같습니다. 이 기대하는대로 작동하지 않습니다. Set Max Results는 데이터베이스 결과 행 의 수를 제한하지만 페치 결합 된 콜렉션의 경우 하나의 루트 엔티티가 여러 행에 를 표시 할 수 있으므로 지정된 수의 결과보다 효과적으로 수화됩니다.

페치 - 조인 콜렉션을 포함하는 교리 쿼리를 어떻게 적절하게 제한합니까 (이 경우 결과를 블로그 게시물 10 개로 제한)?

답변

25

페이지 네이트가 교리 2.2와 병합되었습니다. 새로운 symfony2 릴리스 2.0.10과 호환됩니다.

지금 그와 같은 결과를 호출하여 조회를 작성하는

//use Doctrine paginator 
use Doctrine\ORM\Tools\Pagination\Paginator; 

처럼 사용합니다.

$query->setMaxResults($limit); 
$query->setFirstResult($offset); 
$results = new Paginator($query, $fetchJoin = true); 

희망이 도움이 될 것입니다.

참고 : SF2 2.0.10을 사용하는 경우 deps 및 deps.lock 파일을 업데이트하고 Doctrine 번들에 2.2 버전을 지정해야합니다.

-1

querybuilder와 동일하게 작동합니다. 아마 뭔가 다른 것이 문제일까요?

$qb->add('select', 'b, c, ch, g') 
    ->add('from', 'Broadcast b') 
    ->add('groupBy', 'b.title') 
    ->add('where', 'b.imageBig != \'\'') 
    ->add('orderBy', 'b.starttime ASC') 
    ->setMaxResults(10) 
    ->leftJoin('b.category', 'c') 
    ->leftJoin('b.channel', 'ch') 
    ->leftJoin('b.genre', 'g') 
+0

감사 작성자에게 문의 해 드리겠습니다. 어쩌면 DQL을 사용할 때의 문제 일 수도 있습니다. –

+2

조인 된 컬렉션을 가져 오는 데는 작동하지 않습니다. Christian은 To-One 협회에 가입했습니다. – beberlei

3

이 저장소 http://github.com/beberlei/DoctrineExtensions에는 패치 조인과 함께 작동하는 페이징 확장이 있습니다. 기본적으로 3 개의 SELECT 문을 만들어야하는데,이 확장 모두가 당신을 대신합니다.

+0

감사합니다. DoctrineExtensions없이이 작업을하는 방법을 공유하고 싶습니까?지금 당장은 절대적으로 필요하지 않은 여분의 라이브러리를 포함하고 싶지 않습니다. 나는 또한 이것이 앞으로 많은 다른 독자들에게 도움이 될 것이라고 생각한다. –

+0

확장 코드를 살펴 봐야합니다. 그 : 첫 번째 : 하나의 SELECT DISTINCT mainentity.id WHERE 절 모든 ID를 얻으려면. 둘째 : 이전에 가져온 ID를 가진 WHERE id IN (..)을 가진 하나의 Select Clause. 셋째 : 총 결과 수에 대해 하나의 SELECT DISTINCT 절. – beberlei

+0

고마워, 지금 무슨 일이 일어나고 있는지 알 겠어. 나는 확장을 사용하여 끝내었다. 약간의 오버 헤드가있는 많은 유용한 확장 기능처럼 보입니다. –

-1

Google의 독점적 인 조인 한도를 찾기 위해 오래된 점수이지만 점수가 높습니다. 빨리 그것은 "교리 문단기"를 찾았고, 내가 그것을 찾고 있었는지 (교리적인 페이지 매김이 아닌) Google에 주장한 후에 나는 그것을 사용하는 방법을 알아 내는데 약간의 어려움이있었습니다.

잘못 검색되었지만 실제로 페이지 매김 개체에 대한 좋은 문서를 찾을 수 없습니다. 어쨌든; getIterator를 사용하여 결과를 얻으려면 잘 작동합니다.

내 코드에는 rss 링크가 포함 된 출처와 rss 피드의 기사 인 기사가 있습니다. 그래서이 예제에서는 하나의 소스와 모든 기사를 얻을 것입니다. 이 코드는 Symfony에서 가져 왔습니다.

 // get the articles (latest first) from source 743 
     $q=$this->getDoctrine()->getManager() 
      ->createQuery('select s, a from MyCompanyRssBundle:Source s 
      join s.Articles a 
      where s.id = :id 
      order by a.id desc') 
      ->setParameter('id',743); 
     $q->setMaxResults(1); // this limits Articles to be only 1 
           // when using $q->getResult(); 
     $sources=new Paginator($q, $fetchJoin = true); 
     $sources=$sources->getIterator(); 
     var_dump($sources[0]->getArticles()); 
+1

@adridev 소스는 Paginator로 설정되어 작성된 paginator-> getIterator에 의해 파기됩니다 (2 번째의 소스는 오버라이드 (override)됩니다). 이 의견을 보내 주셔서 감사합니다.이 답변을 더 잘 작성하는 방법에 대한 제안 사항이 있으시면 언제든지이 답변을 수정하십시오. 나는 잠시 동안 교리를 사용하지 않았으므로 나는이 답이 무엇인지에 대해서조차 확신하지 못한다. – HMR

+0

죄송합니다. 의견을 보지 못했습니다. 내 잘못. – adridev

관련 문제