我有两个实体(简化):
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;
}
数据库中可以有多个EncryptedMasterKey
s ExchangeFile
。如果ExchangeFile
删除,所有相关的加密MasterKeys
都将被删除(orphanRemoval=true
并cascade={"persist", "remove"}
确保是这种情况)。到现在为止还挺好。
现在由于实际文件在硬盘上是加密的,因此必须至少有一个EncryptedMasterKey
文件才能解密。所以当 aEncryptedMasterKey
被删除并且我发现它是它的最后一个时ExchangeFile
,我也必须删除它,ExchangeFile
因为它不能再被解密了。一个ExchangeFile
人不能没有至少一个EncryptedMasterKey
。
我如何实现这一目标?@ORM\PreRemove
在EncryptedMasterKey
课堂上并没有真正帮助我,因为我无权访问实体管理器:
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?
}
}
有什么优雅的解决方案吗?
谢谢你的时间。