php – 禁用Doctrine外键约束
发布时间:2020-12-13 18:16:00 所属栏目:PHP教程 来源:网络整理
导读:我和我的一个模特有关系: /*** @ORMManyToOne(targetEntity="Page",cascade="persist")* @ORMJoinColumn(name="page_id",referencedColumnName="id")*/private $parentPage; 当我删除父页面时,我收到此错误: Integrity constraint violation: 1451 Canno
我和我的一个模特有关系:
/** * @ORMManyToOne(targetEntity="Page",cascade="persist") * @ORMJoinColumn(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(即不将其设置为null). 我怎么能用Doctrine做到这一点?
根据定义,如果不将键设置为null(onDelete =“SET NULL”)或级联删除操作(
There are two options – ORM级别:cascade = {“remove”} |数据库级别,则无法删除外键指向的记录: onDelete = “CASCADE”).还有
setting a default value of a still existing record的替代方案,但你必须手动完成,我不认为Doctrine支持这种开箱即用(如果我错了请纠正我,但在这种情况下,设置默认值是不可取的无论如何).
这种严格性反映了具有外键约束的概念;喜欢@Théo说:
软删除(已经提到)是一种解决方案,但您还可以做的是在preRemove事件处理程序(生命周期回调)中删除之前添加另一个与page_id同步的removed_pa??ge_id列.这些信息是否有任何价值我想知道,但我猜你有一些用处,否则你不会问这个问题. 我绝对没有声称这是一个好习惯,但它至少是你可以用于边缘情况的东西.所以有以下几点: 在您的修订版中: /** * @ORMManyToOne(targetEntity="Page",cascade="persist") * @ORMJoinColumn(name="page_id",referencedColumnName="id",onDelete="SET NULL") */ private $parentPage; /** * @var int * @ORMColumn(type="integer",name="removed_page_id",nullable=true) */ protected $removedPageId; 然后在你的页面中: /** * @ORMPreRemove */ public function preRemovePageHandler(LifecycleEventArgs $args) { $entityManager = $args->getEntityManager(); $page = $args->getEntity(); $revisions = $page->getRevisions(); foreach($revisions as $revision){ $revision->setRemovedPageId($page->getId()); $entityManager->persist($revision); } $entityManager->flush(); } 或者,您当然可以在构建修订版期间设置正确的$removedPageId值,然后您甚至不需要在删除时执行生命周期回调. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |