我有两个实体(针对这个问题简化):文件夹:
class Folder {
/**
* @var ArrayCollection
* @ORMOneToMany(targetEntity="File",mappedBy="folder")
**/
private $files;
}
文件:
class File {
/**
* @var Folder
* @ORMManyToOne(targetEntity="Folder",inversedBy="files")
* @ORMJoinColumn(onDelete="CASCADE")
**/
private $folder;
}
我使用数据库级级联来管理实体级联。
我制作了一个事件侦听器,当删除«文件»时触发(为了删除与实体«文件»相关的MongoDB文档)
这里的事件侦听器:
class MysqlMongoDBIntegrity{
/**
* @var DocumentManager
*/
private $_odm;
/**
* @var EntityManager
*/
private $_em;
/**
* @param ContainerInterface
*/
public function setODMManager(DocumentManager $manager)
{
$this->_odm = $manager;
}
public function preRemove(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$this->_em = $args->getEntityManager();
if ($entity instanceof File) {
/** @var MongoDocumentRepository $mongoRepo */
$mongoRepo = $this->_odm->getRepository('MYBundle:MongoDocument');
$mongoRepo->removeMongoDocument($entity->getMongoDocumentId());
}
}
}
当直接删除«文件»实体时,事件按预期触发。但是,当删除«文件夹»实体时,指定为数据库级别的级联不会触发事件。
在不更改@JoinColumn中的级联的情况下,有什么方法可以触发此事件吗?
我知道将级联委托给Doctrine(cascade={"remove"})会更好地触发事件,但是否可以在不替换@Join注释中的级联的情况下做到这一点?
这里解释的很正常:在doctrine2中,无论使用ORM还是ODM,数据库级别配置的级联都不会引发生命周期事件。因此,如果不替换@Join annotations 中的级联,这是不可能的