Doctrine ORM:通过 persist 和 flush 忽略所有事件
Doctrine ORM: Ignore all events with persist and flush
我正在开发一个使用 doctrine/orm
2.6 (PHP 7.1 & MySQL 5.7) 的系统,并尝试使用以下代码更新大量实体:
foreach ($entities as $entity) {
$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush();
}
我 运行 遇到的问题是实体注册了很多生命周期事件(preUpdate、prePersist、postUpdate、postPersist),其中一些事件涉及昂贵的操作,这些操作在以下情况下是不必要的正在进行批量更新。
有没有办法告诉 Doctrine 在每次调用时调用 persist 和 flush 时忽略所有事件(我不想在全局范围内这样做)?
我考虑过的其他选项是:
首先不添加事件:这很困难,因为它们遍布整个系统,并且在应用程序引导的早期设置,在应用程序知道它们是否需要。理想情况下,我想让“忽略事件”选项尽可能靠近使用它的代码,而不是将它散布在整个系统中。
使用 DQL(或 SQL)查询而不是实体:系统中的所有其他内容都使用实体,因此我希望尽可能保持一致(如果不是我会回到这个选项。
@Shiers (Doctrine 2 - Disable PrePersist from outside of entity) 发布的链接问题给了我两个相互矛盾的答案 - 得票最多的人建议可以删除事件,而被接受的人则表示这是不可能的。我尝试了删除选项,但它们没有用。
因此这个问题的答案是无法删除事件,唯一的选择是放入SQL。这就是我在这种情况下所做的并且它起作用了,尽管代价是必须记住手动更新一些将由 ORM 处理的列(例如 updatedAt
)。
我正在开发一个使用 doctrine/orm
2.6 (PHP 7.1 & MySQL 5.7) 的系统,并尝试使用以下代码更新大量实体:
foreach ($entities as $entity) {
$this->getEntityManager()->persist($entity);
$this->getEntityManager()->flush();
}
我 运行 遇到的问题是实体注册了很多生命周期事件(preUpdate、prePersist、postUpdate、postPersist),其中一些事件涉及昂贵的操作,这些操作在以下情况下是不必要的正在进行批量更新。
有没有办法告诉 Doctrine 在每次调用时调用 persist 和 flush 时忽略所有事件(我不想在全局范围内这样做)?
我考虑过的其他选项是:
首先不添加事件:这很困难,因为它们遍布整个系统,并且在应用程序引导的早期设置,在应用程序知道它们是否需要。理想情况下,我想让“忽略事件”选项尽可能靠近使用它的代码,而不是将它散布在整个系统中。
使用 DQL(或 SQL)查询而不是实体:系统中的所有其他内容都使用实体,因此我希望尽可能保持一致(如果不是我会回到这个选项。
@Shiers (Doctrine 2 - Disable PrePersist from outside of entity) 发布的链接问题给了我两个相互矛盾的答案 - 得票最多的人建议可以删除事件,而被接受的人则表示这是不可能的。我尝试了删除选项,但它们没有用。
因此这个问题的答案是无法删除事件,唯一的选择是放入SQL。这就是我在这种情况下所做的并且它起作用了,尽管代价是必须记住手动更新一些将由 ORM 处理的列(例如 updatedAt
)。