gpt4 book ai didi

php - 学说 2 实体关系删除

转载 作者:可可西里 更新时间:2023-10-31 22:05:53 26 4
gpt4 key购买 nike

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

/**
* @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;

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

有人有想法吗?

最佳答案

解决方案

您要找的是orphan removal .

如果您想详细了解为什么您当前的情况不正常,您可以继续阅读。

级联问题

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

$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);

关于php - 学说 2 实体关系删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16575114/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com