Обратные стороны всегда возвращают пустую коллекцию для отношения ManyToMany - PullRequest
0 голосов
/ 11 октября 2018

Это то, что я делал раньше, поэтому я совершенно не понимаю, почему это не работает.

У меня есть две сущности Question и Qresponse.Question является владеющей стороной, а Qresponse является обратной стороной.Когда я использую доктрину для поиска всех Вопросов, свойство qresponses всегда пусто.

//$questions is populated, but the qresponses property is always empty
$questions = $this->getDoctrine()->getManager()->getRepository(Question::class)->findAll();

Почему оно пусто?Что я делаю не так?

Фрагмент стороны владельца: Вопрос

/**
 * Class Question
 * @package Entity
 *
 * @ORM\Entity
 */
class Question
{

    public function __construct()
    {
        $this->qresponses = new ArrayCollection();
    }

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** @var ArrayCollection $responses
     * @ORM\ManyToMany(targetEntity="Qresponse", mappedBy="questions", cascade={"persist"})
     */
    private $qresponses;
}

Фрагмент обратной стороны: ответ

/**
 * Class Response
 * @package Entity
 *
 * @ORM\Entity
 */
class Qresponse
{

    public function __construct()
    {
        $this->questions = new ArrayCollection();
    }

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var ArrayCollection $question
     * @ORM\ManyToMany(targetEntity="Question", inversedBy="qresponses", cascade={"persist"})
     * @ORM\JoinTable(name="qresponse_question")
     */
    private $questions;

}

Изображение заполненной базы данных.

image of database that is populated

Изображение из профилировщика в Symfony, показывающее, что соответствуетпусто ...

image from profiler in symfony showing that qresponses is empty

1 Ответ

0 голосов
/ 11 октября 2018

Вы не делаете ничего плохого, это просто типичная проблема с гидратацией доктрины.

Doctrine по умолчанию использует отложенную загрузку, это означает, что ассоциации загружаются только при необходимости (например, когда вызывается $question->getQResponses()->first()->getId()).Вы можете легко изменить его, установив опцию доктрина fetch в EAGER в вашей ассоциации:

/** 
 * @var ArrayCollection $responses
 * @ORM\ManyToMany(targetEntity="Qresponse", mappedBy="questions", cascade={"persist"}, fetch="EAGER")
 */
private $qresponses;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...