2016-07-02 1 views
1

Symfony에서 서로 관련이있는 두 개의 엔티티 (질문, 답변)가 있습니다. 두 엔티티 사이의 관계는 하나에서 여러 개입니다 (하나의 질문은 여러 개의 대답을 가질 수 있습니다). 두 엔티티 간의 관계에 대한 Symfony의 문서화에 이어, 나는 응답 엔티티에서 Symfony가 생성 한 question_id 필드를 사용하고 있습니다. 내 질문 엔티티 저장소에서 쿼리를 사용하여 모든 질문에 답변을 얻으려고하지만 관련 레코드에 참여하는 방법에 대한 설명이 Joining Related Records in Symfony 인 경우 Symfony에서 별칭이 작동하는 방식을 이해할 수 없습니다. 별칭을 이해하는 데 도움이 될만한 점이 있습니까? 감사합니다 이것은 내 질문 저장소 클래스와 내 컨트롤러에 있습니다. 지금은 내 질문과 관련된 모든 대답 대신 단 하나의 대답 결과를 얻고 있습니다. 내 개체 간의Symfony 쿼리 빌더 및 별칭

public function findOneByIdJoinedToCategory($questionId) 
    { 
     $query = $this->getEntityManager() 
      ->createQuery(
       'SELECT a, q FROM QuizBundle:Answer a 
       JOIN a.answers q 
       WHERE a.id = :id' 
      )->setParameter('id', $questionId); 

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

public function showAction($answerId) 
    { 
     $product = $this->getDoctrine() 
      ->getRepository('QuizBundle:Answer') 
      ->findOneByIdJoinedToCategory($answerId); 

     $data = $product->getAnswer(); 

     return new Response($data); 

     // ... 
    } 

관계 :

class Answer 
{ 

    /** 
    * @ORM\ManyToOne(targetEntity="Question", inversedBy="answers") 
    * @ORM\JoinColumn(name="question_id", referencedColumnName="id") 
    */ 
    private $question; 

public function setQuestion(\QuizBundle\Entity\Question $question = null) 
    { 
     $this->question = $question; 
     return $this; 
    } 
    /** 
    * Get question 
    * 
    * @return \QuizBundle\Entity\Question 
    */ 
    public function getQuestion() 
    { 
     return $this->question; 
    } 
} 


class Question 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="Answer", mappedBy="question") 
    */ 
    private $answers; 
    public function __construct() 
    { 
     $this->answers = new ArrayCollection(); 
    } 

    public function addAnswer(\QuizBundle\Entity\Answer $answer) 
    { 
     $this->answers[] = $answer; 
     return $this; 
    } 

    /** 
    * Remove answer 
    * 
    * @param \QuizBundle\Entity\Answer $answer 
    */ 

    public function removeAnswer(\QuizBundle\Entity\Answer $answer) 
    { 
     $this->answers->removeElement($answer); 
    } 

    /** 
    * Get answers 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 

    public function getAnswers() 
    { 
     return $this->answers; 
    } 

    } 
+1

'만'null' 반환의 예외를 잡으려고합니다. – marc

+0

질문과 답변 사이의 교리 관계를 보여주는 관련 코드를 게시 할 수 있습니까? 아마도 당신은 복잡한 DQL을 필요로하지 않지만 단순히 관계를 탐색 할 수 있습니다. (예를 들어 답을 찾기 만하면'$ answer-> getQuestions()') – Matteo

+0

@Matteo가 ​​편집 된 게시물을 확인합니다. 지금은 내 코드에서 단 하나의 대답을 얻었지만 내 질문에는 두 가지 대답이 있습니다. 질문 id는 필드 question_id의 응답 엔티티에서 참조됩니다. – Otonel

답변

1

귀하의 질문은 심포니보다 교리에 더 많은 의미합니다. Association Mapping과 관련된 Doctrine의 문서를 살펴보십시오.

OneToMany 관계에는 여러 형태가 있습니다. 여기에서 원하는 것은 과 Answer 사이에 bidirectional OneToMany relation이 있어야합니다. 그런 식으로, 당신은 할 수와 같은 요청 : 난 당신이 방법`getOneOrNullResult()`보다는`getSingleResult()를 사용하는 것이 좋습니다

SELECT q, a FROM QuizBundle:Question q JOIN q.answers a WHERE q.id = :id 
+0

엔티티 리포지토리에서 함수를 호출하는 곳에서 컨트롤러에있는 것을 볼 수 있도록 내 게시물을 편집했습니다. 또한 내 개체를 볼 수 있습니다. 의견에서 선택 진술을 사용하여 순간에 내 질문에 대한 모든 내 대답을 얻을. Symfony의 다음 예제를 단지 따르고 ​​있습니다 : [http://symfony.com/doc/current/book/doctrine.html#fetching-related-objects] – Otonel

+1

스크린 샷 대신 코드를 게시하고 의미없는 섹션을 제거해야합니다 . – marc

+0

내 게시물의 편집 된 코드를 사용하면 질문 1에 대한 단일 답변 결과 만 표시되지만 데이터베이스에는이 질문과 관련된 두 가지 대답이 있습니다. – Otonel