我有一个软件,可以拥有许多截图。
这是软件类:
class Software
{
public function __construct()
{
$this->screenshots = new ArrayCollection();
}
/**
* @ORM\OneToMany(targetEntity="Screenshot", mappedBy="software", cascade={"persist"})
* @ORM\OrderBy({"sequence" = "ASC", "id" = "ASC"})
*/
private $screenshots;
public function setScreenshots($screenshots)
{
$this->screenshots = $screenshots;
}
}这是截图类:
class Screenshot
{
/**
* @ORM\ManyToOne(targetEntity="Software", inversedBy="screenshots")
* @ORM\JoinColumn(name="software_id", referencedColumnName="id")
*/
private $software;
/**
* @param mixed $software
*/
public function setSoftware($software)
{
$this->software = $software;
}当我生成一些新的屏幕截图时,将它们放入数组集合中,并使用新的屏幕截图调用$software->setScreenshots($newScreenshots),一切都很正常。新的屏幕截图将被保存,并且它们具有对软件的引用。
但当我生成一些其他屏幕截图并再次调用该方法时,它不会删除旧的屏幕截图。新的屏幕截图是刚刚添加的。
有没有办法有某种级联选项,这样就可以删除旧的屏幕截图?或者至少删除对软件的引用?
发布于 2014-11-11 02:44:24
你可以让de数据库来完成这项工作(DBAL端):
user:
targetEntity: User
inversedBy: points
joinColumn:
name: user_id
referencedColumnName: id
onDelete: 'cascade' #this is important for u
fetch: EAGER发布于 2014-11-08 00:48:34
最简单的解决方案是手动删除它们:
foreach ( $software->getScreenshots() as $scrshot){
$em->remove($scrshot);
}
$software->setScreenshots($newScreenshots);但是,除了这个解决方案之外,你有没有尝试过在逆边或关系上定义orphanRemoval?也许这会有帮助,但我不确定:
/**
* @ORM\OneToMany(targetEntity="Screenshot", mappedBy="software", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"sequence" = "ASC", "id" = "ASC"})
*/
private $screenshots;https://stackoverflow.com/questions/26805014
复制相似问题