2013-02-01 6 views
1

한 페이지에 여러 버전이있는 일대 다 관계가 있습니다.Doctrine oneToMany - 하나를 쿼리하는 중

**page** 

id 
parent_id 

**page_version** 
id 
page_id 
title 
published 
date 

이는 외래 키 page_id와 관련이 있습니다.

class PageVersion 
{ 
    /** 
    * @var page 
    * 
    * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageversions") 
    * 
    */ 
    private $page; 

} 

class Page 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="PageVersion", mappedBy="page") 
    */ 
    private $pageversions; 
} 
그래서 나는 각 페이지에 대한 모든 페이지 버전을 얻을 수 있습니다 : 그래서 나는 페이지 실체와 PageVersion 엔티티가 있습니다. 그러나 각 페이지에는 하나의 게시 된 페이지 버전 만 있습니다. 따라서 최신 버전을 얻으려면 어떻게해야합니까? 예. 모든 버전의 목록을 가져 오는 대신 발행 된 버전 = '1'입니까? 여기

내 쿼리의 예입니다

public function findAllPages() 
{ 
    $query = $this->getEntityManager() 
     ->createQuery(' 
     SELECT DISTINCT p,v 
     FROM XYZWebsiteBundle:Page p 
     JOIN p.pageversions v 
     WHERE v.published = :published 
     AND v.deleted = :deleted' 
    )->setParameters(array('published' => 1, 'deleted' => 0)); 

    try { 
     return $query->getResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
} 

그러나 만약 내가에만 페이지 속성이 아니라 PageVersion 속성 예를 들어 제목, 출판, 날짜 등

$entities = $em->getRepository('XYZWebsiteBundle:Page')->findAllPages();

에 액세스 할 수있는 결과를 통해 I 루프
foreach($entities as $entity){ 
     print($entity->getPageVersion()->getTitle()); 
    } 

반환 된 오류는 치명적 오류입니다. 정의되지 않은 메서드 Doctrine \ ORM \ PersistentCollection :: getTitle()을 호출하십시오. 게시 된 상태로 더 이상 한 페이지가 없을 것 확실하다면

답변

0
$er = $this->getDoctrine()->getRepository('XYZWebsiteBundle:Page'); 
$qb = $er->createQueryBuilder('p') 
    ->where('p.published = :published') 
       ->setParameter('published', 1) 
    ; 

$entities=$qb->getQuery()->getResult(); 

, 당신도 대신 getResult를의()) getOneOrNullResult을 (사용할 수 있습니다. 일치하는 엔티티가없는 경우는 null, 엔티티가있는 경우는 엔티티, 복수의 엔티티가있는 경우는 예외를 돌려줍니다.

편집 : 좋습니다. 따라서 페이지가 아닌 PageVersion에서 쿼리를 작성해야합니다. 시도해보십시오 :

$er = $this->getDoctrine()->getRepository('XYZWebsiteBundle:PageVersion'); 
    $qb = $er->createQueryBuilder('p') 
     ->where('p.page = :page') 
        ->setParameter('page', $page) 
     ->andWhere('p.published = :published') 
        ->setParameter('published', 1) 
     ; 

    $pageVersion=$qb->getQuery()->getResult(); 

게시 된 버전을 찾으려는 페이지가 $ page입니다.

+0

감사합니다. 그걸 시도했지만 다음과 같은 오류가 발생했습니다. [의미 상 오류] '게시 된 ='근처에 줄 0, 열 54 : 오류 : 클래스 XYZ \ WebsiteBundle \ Entity \ 페이지에 게시 된 필드 또는 연결이 없습니다. FYI 게시 된 필드는입니다. 페이지가 아닌 page_version 내에서 어떻게 이것을 쿼리에서 참조 할 수 있습니까? – user1961082

+0

새 쿼리로 내 대답을 편집했습니다. – banban

+0

감사합니다. 더 많은 정보를 제공하기 위해 관리 사용자가 추가/편집/삭제할 수있는 CMS의 페이지 목록이 있습니다. 모든 페이지를 나열하고자하는 listAction이있는 경우 단순히 모든 페이지를 가져 오기 위해 쿼리를 실행합니다 엔티티 (이 시점에서 버전에 대해 중요하지 않으므로) 편집 페이지에서 편집하려는 경우 두 번째 쿼리를 실행하여 최신 버전 (게시 된 버전 = 1)을 얻으시겠습니까? 그러면 최신 버전 데이터를 가져 와서 편집 할 수 있습니다. – user1961082

관련 문제