При наличии связи «многие ко многим» данные связанного класса не могут быть получены с помощью метода find в doctrine и symfony2. - PullRequest
0 голосов
/ 27 марта 2012

Я использую доктрину с фреймворком symfony2.У меня есть сущность «Вопрос», которая может иметь несколько «Тем».Таким образом, я определил это отношение «многие к мая» (с другой стороны, темы могут иметь несколько вопросов) в yml:

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

И внутри класса сущностей Вопрос:

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

Здесь question_themes - это таблица (в MySQL), которая содержит отношение «многие ко многим», т. Е. Question_id и theme_id.

Теперь, когда я получаю данные вопроса по:

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

или

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

и т. Д.он выбирает все связанные данные темы вместе с вопросами, например

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

Все выглядит идеально.Но всякий раз, когда я получаю данные вопроса с помощью:

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

или

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

и т. Д., Связанные данные темы не выбираются, и поэтому я получаю ошибку в цикле foreach:

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

Может ли кто-нибудь помочь в этом, так как я новичок в доктрине и Symfony2?

Спасибо

1 Ответ

0 голосов
/ 27 марта 2012

Попробуйте немного изменить настройщик вашей сущности.Вместо использования setThemes (или setQuestions в сущности темы) я бы использовал функцию «добавить», потому что это массив ();

Также я на всякий случай помещаю ссылку на аннотацию.

/**
 * @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;
}

Также внесите это изменение в объект Theme (но с аннотацией в виде inversedBy вместо mappedBy).Обновите свою схему и попробуйте.

...