2012-03-27 10 views
0

Ich verwende Lehre mit Symfony2 Framework. Ich habe eine Entität "Frage", die mehrere "Themen" haben kann. So definiert ich diese many-to-may-Beziehung (auch auf der anderen Seite Themes können mehrere Fragen haben) in yml:Mit Viele-zu-viele-Beziehung können die zugehörigen Klassendaten nicht mit Find-Methode in Doktrin und Symfony2 abgerufen werden.

manyToMany: 
    themes: 
     targetEntity: Theme 
     joinTable: 
     name: question_themes 
     joinColumns: 
      question_id: 
      referencedColumnName: id 
     inverseJoinColumns: 
      theme_id: 
      referencedColumnName: id 

Und in der Frage Entitätsklasse:

private $themes; 
public function setThemes($themes) { 
    $this->themes = $themes; 
} 
public function getThemes() { 
    return $this->themes; 
} 

Hier question_themes ist eine Tabelle (in MySQL), die die Viele-zu-Viele-Beziehung enthält, dh question_id und theme_id.

Wenn ich jetzt holen Frage Daten von:

$questions = $this->getDoctrine()->getRepository('MyBundle:Question')->findAll(); 

oder

$questions = $this->getDoctrine()->getRepository('MyBundle:Question')->findBy(
       array('locale'=>$locale), 
       array('createdAt' => 'DESC') 
      ); 

usw. es holt all den damit verbundenen Themen Daten zusammen mit Fragen, dh

foreach($questions as $question) { 
    foreach($question->getThemes() as $theme) { 
     // some code 
    } 
} 

Alles scheint perfekt . Aber immer, wenn ich hole die Frage Daten von:

$question = $this->getDoctrine()->getRepository('MyBundle:Question')->find($question_id); 

oder

$question = $this->getDoctrine()->getRepository('MyBundle:Question')->findById($question_id); 

etc, dann den dazugehörigen Themendaten werden nicht abgerufen und damit bin ich Fehler immer bei der foreach-Schleife:

foreach($question->getThemes() as $theme) { 
    // some code 
} 

Kann mir jemand helfen, da ich neu in der Lehre und symfony2 bin?

Dank

Antwort

0

Versuchen Sie, Ihre Setter Einheit ein wenig zu verändern. Anstatt setThemes (oder setQuestions in der Themenentität) zu verwenden, würde ich eine "add" -Funktion verwenden, weil es ein Array() ist;

Auch ich habe die Annotation Referenz dort nur für den Fall.

/** 
* @ORM\ManyToMany(targetEntity="Path\To\Entity\Theme", mappedBy="questions") 
*/ 
private $themes; 

public function addTheme(Theme $theme) 
{ 
    $this->themes[] = $theme; 
} 

public function getThemes() 
{ 
    return $this->themes; 
} 

Auch diese Änderung in der Theme-Einheit (aber mit dem Vermerk als inversedBy statt mappedBy). Aktualisieren Sie Ihr Schema und versuchen Sie es.

+0

Ich verwende Yml anstelle von Annotation, so definiert das Schema wie in der Frage. Ich habe den Entity-Getter-Setter entsprechend geändert, aber das hat mein Problem nicht gelöst. Wie kann ich jedoch gemäß Ihrer Schemadefinition die Tabelle fragment_themes angeben, die die Viele-zu-Viele-Beziehung enthält? – sumanchalki

+0

Mit Anmerkungen basierend auf dem von mir bereitgestellten Code würde die Tabelle question_themes nach dem Aufruf von doctrine automatisch generiert: schema: update --force Siehe: http://tracehello.wordpress.com/2011/05/08/symfony2-doctrine2-manytomany- association/Wie für die Verwendung von Yml, um ehrlich zu sein, habe ich es nur in einem meiner Projekte verwendet und hatte keine viel-Beziehung. – Shattuck