【发布时间】:2017-01-14 12:00:36
【问题描述】:
我与我的一个模型有关系:
/**
* @ORM\ManyToOne(targetEntity="Page", cascade="persist")
* @ORM\JoinColumn(name="page_id", referencedColumnName="id")
*/
private $parentPage;
当我删除父页面时,我得到这个错误:
Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails
基本上我的模型是一个页面和页面修订。当我删除页面时我不想删除修订。我还想在页面修订中保留page_id(即不将其设置为空)。
我怎样才能用 Doctrine 做到这一点?
【问题讨论】:
-
很抱歉错误的近距离投票,我误读了您的问题。您需要做的是删除实际的外键约束。如果约束是通过 Doctrine 创建的,您需要将其配置为不再这样做,否则您只需要继续删除它
-
另一种方法可能是添加一个属性(例如,
enabled),将页面从搜索中排除。这样做会产生页面被删除而不违反外键约束的效果。 -
@Phil 我认为即便如此,从 Doctrine 的角度来看,数据不一致可能还会存在更多问题。我建议实现页面的软删除(在这种情况下我最喜欢)或将
page_id列复制为“备份”,然后在删除页面时在page_id上设置null。 -
软删除可能是最正确的解决方案,但是更改应用程序的所有其他部分以过滤掉已删除的实体会很耗时。切换到 MyISAM 也可以,这是我所做的,但并不理想。
-
@Petah 如果您使用gedmo 实现软删除,则无需更改任何内容即可过滤掉已删除的实体,只需在配置文件
doctrine: orm: entity_managers: default: filters: softdeleteable: [class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter & enabled: true]中添加默认过滤器即可。然后,每当您想获取已删除的实体时,只需暂时禁用过滤器$filters = ...->get('doctrine')->getEntityManager()->getFilters(); $filters->disable('softdeleteable'); query then enable
标签: php mysql symfony doctrine-orm