【发布时间】:2017-03-23 15:43:05
【问题描述】:
我有以下代码:
//Delete old existing file(s)
$files = $record->getFiles();
foreach ($files as $file) {
$em->remove($file);
}
$em->flush();
$link = $record->getLink() ? $record->getLink() : new Link();
$link->setRecord($record);
$link->setUrl($metaData['location']);
$em->persist($link);
$em->flush();
我需要调用第一个flush(),否则$file 实体不会被删除。为什么只使用第二个flush() 不能删除它们?
供参考,这里是Record的关系定义:
/**
* @var \AppBundle\Entity\Link
*
* @ORM\OneToOne(targetEntity="AppBundle\Entity\Link", cascade={"persist"}, mappedBy="record")
*/
private $link;
/**
* @var \AppBundle\Entity\File
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\File", cascade={"persist"}, mappedBy="record")
*/
private $files;
此外,此代码使用单个 flush() 可以正常工作(它删除的是 OneOnOne 实体而不是 OneToMany):
//Delete old existing link
$link = $record->getLink();
if ($link) {
$em->remove($link);
}
$file = $record->getFile() ? $record->getFile() : new File();
$file->setRecord($record);
$em->persist($file);
$em->flush();
【问题讨论】:
-
$files属性上的orphanRemoval=true怎么样?然后你有一个文件Collection,如果需要,你可以在Record实体刷新上重置 -
孤儿不起作用,问题在于文件上的 'cascade={"persist"}'。我会再做一些调试,看看能不能解决这个问题
标签: php symfony doctrine-orm