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=true
中 PollAnswers
,像这样:
* @ORM\OneToMany(targetEntity="PollAnswers", ... , orphanRemoval=true)
查看文档 here。
因此,在我使用 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=true
中 PollAnswers
,像这样:
* @ORM\OneToMany(targetEntity="PollAnswers", ... , orphanRemoval=true)
查看文档 here。