首先,我将Doctrine v2.6.2与Symfony v4.1.7结合使用。
我有一个实体Product
,该实体(除其他外)与另一个实体AlternativeDuration
具有单向一对多关系。根据Doctrine的文档,我的产品类中的映射如下所示:
/**
* @ORM\ManyToMany(
* targetEntity="AlternativeDuration",
* cascade={"persist", "merge", "remove"},
* orphanRemoval=true
* )
* @ORM\JoinTable(name="ProductAlternativeDurations",
* joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id", onDelete="CASCADE", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="alternative_duration_id", referencedColumnName="id", unique=true, onDelete="CASCADE", nullable=false)}
* )
*/
protected $alternativeDurations;
我的应用程序最近开始使用React,这意味着我现在提交我的产品的JSON表示形式(以及一系列可选的持续时间),我需要在后端将其反序列化为Product
实体。我为此使用了默认配置的JMS序列化程序。
现在,在编辑现有产品时出现了我所遇到的问题,该产品已经具有我要删除的替代期限。提交的JSON如下所示:
{
"id": 1, # the ID of the existing product here
"alternativeDurations": [] # empty array because the entry is removed
}
在后端,我成功地反序列化了JSON字符串:
$serializedProduct = $this->serializer->deserialize($jsonString, Product::class, 'json');
我在这里验证了$serializedProduct
没有替代的持续时间。然后我进行合并+刷新。我希望合并能够获取现有产品并用$serializedProduct
进行补充。
$em->merge($serializedProduct); # $em being the EntityManager.
$em->flush();
现在,我希望AlternativeDuration
条目以及ProductAlternativeDurations
连接表条目被删除。但是,结果是ProductAlternativeDurations
中的条目已删除,但AlternativeDuration
仍然存在。
我现在很茫然,任何人都可以提出一些有关为什么不删除AlternativeDuration
条目的指示?
编辑19-11-2018:
这似乎是教义中的一个已知错误:#2542
merge
也将在Doctrine3中被删除,因此我可能一般需要重新考虑这种方法。