Doctrine - "automatically" 在调用 setter 时删除子集合元素

Doctrine - "automatically" delete children collection elements, when calling setter on parent

因此,在我使用 Doctrine 的应用程序中,我有实体 Polls 和 PollAnswers。 PollAnswers 作为 ManyToOne 链接到民意调查:

class PollAnswers
{
    /**
     * @var \Polls
     *
     * @ORM\ManyToOne(targetEntity="Polls", inversedBy="answers", fetch="LAZY")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="poll_id", referencedColumnName="id")
     * })
     */
    private $poll;

当我 add/delete/update 从 UI 轮询答案时,我 运行 下一个代码:

    $answers = new ArrayCollection;
    foreach ($_POST['answers'] as $key => $answer)
    {
        $poll_answer = $em->getRepository(PollAnswers::class)->find($_POST['answers_ids'][$key]) ?: new PollAnswers;

        $poll_answer->setPoll($poll);
        $poll_answer->setAnswer($answer);

        $answers[]=$poll_answer;
    }

    $poll->setAnswers($answers);

    $em->persist($entity);
    $em->flush();

但是,如果从 UI 中删除投票答案,它会保留在数据库中。 所以,另外我必须写这样的 "ugly" 部分代码:

    foreach ($poll->getAnswers() as $answer)
        if (!$answers->contains($answer))
            $em->remove($answer);

我能否以某种方式避免添加此 "ugly" 部分?所以,当我执行 setAnswers($answers) 时,Doctrine 会自动找到 removed/missing 个实体并删除它们?我敢肯定,有一种 "elegant" 方法可以做到这一点。

在您的 Poll 实体集 orphanRemoval=truePollAnswers,像这样:

* @ORM\OneToMany(targetEntity="PollAnswers", ... , orphanRemoval=true)

查看文档 here