2013-03-16 1 views
1

Symfony의 "Book"에서는 다른 엔티티에 대한 참조로 엔티티에 대해 이야기합니다. 마찬가지로, "Post"엔티티를 참조하는 많은 "Comment"엔티티가있는 경우, 해당 ID로 포스트를로드 한 다음 $ post-> getComments()를 수행 할 수 있습니다.Doctrine을 사용하면 어떻게 EntityRepository에서 Entity 메소드에 액세스합니까?

댓글은 게으르며로드 된 것으로 보이며 한 장씩 이동하거나 각로드 (분명히 잘못됨)하거나 별도의 쿼리로 모두로드해야합니다. ,하지만 구체적으로 어디에 그 쿼리를 넣을지 모르겠습니다.) The Book, however, suggests : "물론 두 개체에 모두 액세스해야한다는 것을 알면 원래 쿼리에서 조인을 실행하여 두 번째 쿼리를 피할 수 있습니다." 내 (현재 비어있는) postRepository 클래스에 메소드를 추가 할 것을 권장합니다. \ 정의되지 않은 메서드의 교리 전화 : 내가 할, 그것은 다음과 같습니다

public function loadPostFull($pid) 
{ 
    return $this->getEntityManager() 
     ->createQuery(' 
      SELECT p, c FROM BUNDLENAME:Post p 
      JOIN p.comments c 
      WHERE p.id = :id') 
     ->setParameter('id', $pid); 
    try { 
     return $query->getSingleResult(); 
    } catch (\Doctrine\ORM\NoResultException $e) { 
     return null; 
    } 
} 

그리고 내 컨트롤러에서 내가 할 다음 :

$fullPost = $this->getDoctrine() 
      ->getRepository('BUNDLENAME:Post') 
      ->loadPostFull($id); 
$id = $fullPost->getId(); 

을하지만 $ ID에 대한 내 간단한 요청이 "치명적인 오류를 제공 ORM \ Query :: getId() "를 참조하십시오. 나는 컨트롤러가 loadPostFull 메소드를 올바르게 찾는 것을 알고있다. 왜냐하면 내가 typo 이름을 붙이면 실패 할 것이기 때문이다. 적절한 Post 엔티티를 반환하지 않습니다. 컨트롤러를 변경하여 -> loadPostFull ($ id) 대신 find ($ id)를 사용하면 Post ID의 모든 내부 메소드를 사용할 수 있습니다.

설명서에 내가 할 수있는 것으로 보입니다! 뭐가 문제 야?

답변

2

나는 오타가 있다고 생각합니다. :). 코드의 첫 번째 줄을보십시오. return 성명을 기입하십시오! 따라서 Query 객체를 반환하고 {} catch() {}에 도달하지 마십시오. 다음과 같이 입력해야합니다.

$query = $this->getEntityManager() 
    ->createQuery(' 
     SELECT p, c FROM BUNDLENAME:Post p 
     JOIN p.comments c 
     WHERE p.id = :id') 
    ->setParameter('id', $pid); 
try { 
    return $query->getSingleResult(); 
} catch (\Doctrine\ORM\NoResultException $e) { 
    return null; 
} 
+0

Welp, 당신이 해냈어! 정말 고맙습니다. 이제 와서 나머지 프로그램을 쓰고 싶니? :-D 위대한 작품. – Offlein

+0

글쎄 이런 종류의 "오류"가 얼마나 끔찍한 지 압니다. 당신은 당신의 머리카락을 풀어 당신은 단지 그것을 알아 차리지 못합니다 :) – Viorel