Doctrine 条令-“自动”删除子集合元素,在父集合上调用setter时

Doctrine 条令-“自动”删除子集合元素,在父集合上调用setter时,doctrine,entity,Doctrine,Entity,所以,在我的应用程序中,使用条令,我有实体民意测验和民意测验答案。PollAnswers作为多个选项链接到投票: class PollAnswers { /** * @var \Polls * * @ORM\ManyToOne(targetEntity="Polls", inversedBy="answers", fetch="LAZY") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="po

所以,在我的应用程序中,使用条令,我有实体民意测验和民意测验答案。PollAnswers作为多个选项链接到投票:

class PollAnswers
{
    /**
     * @var \Polls
     *
     * @ORM\ManyToOne(targetEntity="Polls", inversedBy="answers", fetch="LAZY")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="poll_id", referencedColumnName="id")
     * })
     */
    private $poll;
当我从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中删除,它将保留在数据库中。所以,除此之外,我还得写这么难看的代码:

    foreach ($poll->getAnswers() as $answer)
        if (!$answers->contains($answer))
            $em->remove($answer);
我能不能避免加上这个难看的部分?那么,当我设置answers$answers时,Doctrine会自动查找已删除/缺失的实体并将其删除?我确信,有一种优雅的方法可以做到这一点。

在您的Poll entity集合中,对于PollAnswers,orphanRemove=true,如下所示:

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

请参阅文档。

当我添加orphanRemoving=true时,这可能是一种方式,但没有按预期工作。它删除所有现有的子实体。比如说,我有下一个答案实体:A,B,C。我加上D。结果,只有答案D存在,A,B,C被删除:在你的代码中,我只看到你调用setAnswers,在这种情况下,你描述的A,B,C被删除将是预期的行为。你真的在叫addPollAnswer吗?在我的setAnswers中,我做$this->answers=$answers;$answers包含ArrayCollection和我使用$em->getRepositoryPollAnswers::class->find和新添加的答案D找到的旧答案A、B、C。那么,如果我将A、B、C、D发送给setAnswers,为什么A、B、C会被删除?我已经从$this->answers=$answers更新了我的setAnswers;要$this->getAnswers->clear;foreach$answers作为$answer$this->getAnswers->add$answer;现在,使用orphanRemoving=true,它可以按预期工作!