11

我有一个与“属性”实体具有以下关系的拥有实体:

/**
* @ORM\OneToMany(targetEntity="Attribute", mappedBy="entity", cascade={"persist", "remove", "merge"})
**/
protected $attributes;

另一方面,拥有的实体关系如下所示:

/**
* @ORM\ManyToOne(targetEntity="Entity", inversedBy="attributes")
* @ORM\JoinColumn(name="entity_id", referencedColumnName="id")
*/
protected $entity;

当我创建一个实体的实例时,向它添加属性并保存它。一切正常。当我从实体中删除一个属性并保留时,该属性不会在数据库中删除,而是在刷新时重新出现。

有人有想法吗?

4

2 回答 2

36

解决方案

您正在寻找的是孤儿移除

如果您想了解当前情况为何不起作用的详细信息,可以继续阅读。

级联问题

不幸的是,级联操作不会做你想做的事。“cascade=[remove]”只是意味着如果实体对象被删除,那么学说将循环遍历并删除所有子属性:

$em->remove($entity);
// doctrine will basically do the following automatically
foreach ($entity->getAttributes() as $attr)
{
    $em->remove($attr);
}

如何手动完成

如果您需要从实体中删除属性,您可以像这样删除该属性:

$entity->getAttributes()->removeElement($attr);
$em->remove($attribute);

解决方案详情

但是,要自动执行此操作,我们使用孤儿删除选项。我们简单地告诉学说,属性只能属于实体,如果一个属性不再属于一个实体,只需将其删除:

/**
 * @ORM\OneToMany(targetEntity="Attribute", mappedBy="entity", orphanRemoval=true, cascade={"persist", "remove", "merge"})
 **/
protected $attributes;

然后,您可以通过简单地执行以下操作来删除该属性:

$entity->getAttributes()->removeElement($attr);
于 2013-05-15T22:35:22.093 回答
3

使用孤立删除时要小心。

如果您删除一个元素,然后在主实体上调用刷新,则该元素不会从教义的内部孤立删除数组中删除。

如果稍后调用刷新,将导致从数据库中删除该条目,忽略刷新。

这对我来说似乎是一个错误,并导致我的应用程序中许多产品的图像丢失。在计划删除这些实体之后,我必须实现一个侦听器以再次对这些实体调用persist。

于 2015-02-09T08:50:49.863 回答