Symfony2 - 数据库级别onDelete Cascade不会触发LifeCycle事件

时间:2013-12-16 10:48:37

标签: php mongodb symfony doctrine-orm event-listener

我有两个参与者(针对这个问题进行了简化): 文件夹:

class Folder {
    /**
     * @var ArrayCollection
     * @ORM\OneToMany(targetEntity="File",mappedBy="folder")
     **/
    private $files;
}

档案:

class File {
    /**
     * @var Folder
     * @ORM\ManyToOne(targetEntity="Folder",inversedBy="files")
     * @ORM\JoinColumn(onDelete="CASCADE")
     **/
    private $folder;
}

我正在使用数据库级级联来管理实体级联。

我删除了一个«File»时删除了一个事件监听器(为了删除与实体«File»相关的MongoDB文件)

这里是eventListener:

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());
        }
    }
}

直接删除«File»实体时会按预期触发事件。但是,当删除«Folder»实体时,指定为数据库级的级联不会触发事件。

有没有办法在不改变@JoinColumn中的级联的情况下触发此事件?

我知道将级联委托给Doctrine(cascade = {“remove”})会更好地触发事件,但是有可能在不更换@Join注释中的级联的情况下这样做吗?

1 个答案:

答案 0 :(得分:2)

正如here所解释的那样正常:在doctrine2中,无论您使用ORM还是ODM,数据库级别配置的级联都不会引发生命周期事件。因此,如果不在@Join注释中替换级联,则无法实现