Symfony 5 一对一关联场景下删除对象未生效反而生成新ID问题咨询
问题核心原因
你遇到的删除失效、反而生成新ID的问题本质是Doctrine的工作单元(UnitOfWork)检测到被你标记删除的AnalyseOfCause对象依然被托管状态的Record实体引用,结合配置的级联持久化规则,在flush的时候会先把被标记删除的对象重新持久化入库,所以就出现了原有内容保留、生成新ID的现象,和你调用了Record对象直接相关。
解决方案
- 先断开两个实体的关联再执行删除,示例代码如下:
// 假设Record是关联的拥有方,先把关联字段置空 $record->setAnalyseOfCause(null); $entityManager->persist($record); // 再执行删除操作 $entityManager->remove($analyseOfCause); $entityManager->flush();
- 检查关联注解的级联配置,确认
Record实体上OneToOne注解的cascade配置没有多余的persist规则,如果你不需要级联更新/持久化可以直接去掉该配置。 - 排查Softdeletable Bundle的影响,即使你没有给这两个实体开启软删除,也要确认是否全局开启了软删除过滤,如果是可以在删除前临时关闭过滤:
$entityManager->getFilters()->disable('softdeleteable'); // 执行flush操作后如果需要可以再重新开启
- 如果回退版本后依然失效,可以先清空Symfony缓存,排除缓存导致的配置不生效问题:
php bin/console cache:clear
- 如果还是无法定位问题,可以在flush前打印工作单元的调度队列,确认目标对象的状态:
$uow = $entityManager->getUnitOfWork(); // 查看待删除队列 var_dump($uow->getScheduledEntityDeletions()); // 查看待插入队列 var_dump($uow->getScheduledEntityInsertions());
如果发现要删除的AnalyseOfCause出现在待插入队列,就能100%确认是关联引用导致的重新持久化问题。
内容的提问来源于stack exchange,提问作者yavuz16dev
相关产品推荐
相关产品推荐

