gpt4 book ai didi

doctrine-orm - 学说 "reverse"孤儿去除

转载 作者:行者123 更新时间:2023-12-01 12:47:05 25 4
gpt4 key购买 nike

我有两个实体(简化):

class EncryptedMasterKey {
/**
* @ORM\ManyToOne(targetEntity="ExchangeFile", inversedBy="encryptedMasterKeys")
* @ORM\JoinColumn(name="exchange_file_id", referencedColumnName="id")
*
* @var ExchangeFile
*/
protected $exchangeFile;
}

class ExchangeFile {
/**
* @ORM\OneToMany(targetEntity="EncryptedMasterKey", mappedBy="exchangeFile", orphanRemoval=true, cascade={"persist", "remove"})
*/
protected $encryptedMasterKeys;
}

数据库中一个ExchangeFile可以有多个EncryptedMasterKey。如果 ExchangeFile 被删除,所有相关的加密 MasterKeys 都会被删除(orphanRemoval=truecascade={"persist", "remove " 确保是这种情况)。到目前为止,还不错。

现在,由于实际文件在硬盘上是加密的,因此必须至少有一个EncryptedMasterKey,这样文件才能被解密。因此,当 EncryptedMasterKey 被删除时,我发现它是 ExchangeFile 的最后一个,我还必须删除 ExchangeFile 因为它无法再被解密。没有至少一个 EncryptedMasterKeyExchangeFile 就无法生存。

我如何实现这一目标? EncryptedMasterKey 类中的@ORM\PreRemove 对我没有真正的帮助,因为我无权访问实体管理器:

class EncryptedMasterKey {
//...
/** @ORM\PreRemove */
public function removeOrphanExchangeFile()
{
if ($this->exchangeFile->isTheOnlyMasterKey($this))
// I don't have access to the Entity Manager,
// so how do I delete the ExchangeFile?
}
}

有什么优雅的解决方案吗?

感谢您的宝贵时间。

最佳答案

您可以使用 event subscriber并创建如下类:

class MyEncryptedMasterSubscriber implements \Doctrine\Common\EventSubscriber
{
public function getSubscribedEvents()
{
return array(\Doctrine\ORM\Events::onFlush);
}

public function onFlush(\Doctrine\ORM\Events\OnFlushEventArgs $eventArgs)
{
$uow = $eventArgs->getEntityManager()->getUnitOfWork();


foreach ($uow->getScheduledEntityDeletions() AS $entity) {
if (
$entity instanceof EncryptedMasterKey
&& $entity->getExchangeFile()->isTheOnlyMasterKey($entity)
) {
$uow->scheduleForDelete($entity->getExchangeFile());
}
}
}
}

您可以在 the documentation 上阅读更多关于如何在 Symfony 2 的特殊情况下注册订阅者的信息。

关于doctrine-orm - 学说 "reverse"孤儿去除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14898835/

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