2016-07-02 7 views
1

In Symfony habe ich zwei Entitäten (Frage, Antwort), die miteinander verwandt sind. Die Beziehung zwischen den beiden Entitäten ist ONE to MANY (eine Frage kann viele Antworten haben) Nach der Symfony-Dokumentation zu den Beziehungen zwischen zwei Entitäten verwende ich ein Frage_id-Feld, das von Symfony in der Antworteinheit generiert wurde. Mit einer Abfrage in meinem Frageentitätsrepository versuche ich eine Frage mit allen Antworten zu erhalten, aber nach der Dokumentation Joining Related Records in Symfony über das Verknüpfen verwandter Datensätze kann ich nicht verstehen, wie Aliase in Symfony funktionieren. Wäre wirklich etwas Hilfe beim Verstehen von Aliasen zu schätzen. Danke Das ist, was ich in meiner Frage Repository-Klasse und in meinem Controller habe. Im Moment bekomme ich ein einziges Antwortergebnis statt aller Antworten, die sich auf meine Frage beziehen.Symfony Query Builder und Aliase

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); 

     // ... 
    } 

Beziehung zwischen meinen Einheiten:

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

Ich schlage vor, die Methode zu verwenden 'getOneOrNullResult()' 'statt getSingleResult()', wenn Sie nur die Ausnahme fangen für die Rückgabe 'null'. – marc

+0

Kannst du den relevanten Code posten, der die Beziehung der Lehre zwischen Frage und Antwort zeigt? wahrscheinlich brauchst du keinen komplexen DQL, aber du könntest einfach durch die Relationen navigieren .... (Als Beispiel such einfach nach der Antwort dann mach '$ answer-> getQuestions() ') lass es mich wissen – Matteo

+0

@Matteo überprüfe den bearbeiteten Post. In meinem Code bekomme ich im Moment nur eine einzige Antwort, aber es gibt zwei Antworten auf meine Frage. Die Frage-ID wird in der Antwort-Entität im Feld question_id referenziert. – Otonel

Antwort

1

Ihre Frage bezieht sich mehr auf Lehre als Symfony. Sie sollten sich die Doktrin-Dokumentation zu Association Mapping ansehen.

Es gibt mehrere Formen von OneToMany-Beziehungen. Was Sie wahrscheinlich wollen, ist hier eine bidirectional OneToMany relation zwischen Question und Answer zu haben. Auf diese Weise können Sie eine Anfrage stellen wie:

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

Ich habe meinen Post bearbeitet, damit Sie sehen können, was ich in der Steuerung habe, wo ich die Funktion vom Entity-Repository aufruft. Außerdem kannst du meine Entitäten sehen. Im Moment verwende ich Ihre Select-Anweisung aus dem Kommentar Ich bekomme meine Frage nicht alle meine Antworten auf die Frage. Ich folge nur diesem Beispiel von Symfony: [http://symfony.com/doc/current/book/doctrine.html#fetching-related-objects] – Otonel

+1

Sie sollten auf jeden Fall den Code anstelle eines Screenshots posten und bedeutungslose Abschnitte entfernen . – marc

+0

Mit dem bearbeiteten Code in meinem Beitrag bekomme ich nur ein einziges Ergebnis, für Frage 1, aber in meiner Datenbank habe ich zwei Antworten, die sich auf diese Frage beziehen. – Otonel