gpt4 book ai didi

php - onFlush 事件处理程序中的大量更新和删除

转载 作者:行者123 更新时间:2023-11-29 04:24:13 26 4
gpt4 key购买 nike

我想为我的学说模型添加一个安全层。为了能够在 SQL 级别的原则过滤器中添加权限检查,我必须维护一些数据库表,其中包含为每个实体计算的访问控制 token 的缓存。

现在我必须更新这些表,在某些情况下我必须完全重建其中一个缓存表。这必须在监听 onFlush 事件的事件监听器中完成。什么是最好的(最高效和最可靠的)存档方式?

记录了如何持久化新实体以及如何更改已持久化实体的关联和原始属性。这是通过调用工作单元对象的 computeChangeSet() 或 recomputeSingleEntityChangeSet() 并将每个单个实体传递给这些方法之一来完成的。在这些更新期间必须锁定整个系统,尽管它们很少见,但应尽快完成。我也不知道如何删除实体甚至截断整个表而不必先读出所有实体。

  • 如何删除 onFlush 事件中的实体?
  • 如何在 onFlush 事件中进行大量更新(表格截断和插入数十万条记录)?我想我可以在这种情况下使用 $EntityManager->getConnection()->executeUpdate(),对吗?
  • 如何在 onFlush 事件中锁定表(读取)?

最佳答案

首先,onFlush的功能很强大,估计是你想多了。

要在 onFlush 中删除实体,只需安排它们在您的监听器中删除:

public function onFlush(OnFlushEventArgs $eventArgs) {
$em = $eventArgs->getEntityManager();
$uow = $em->getUnitOfWork();

foreach ($uow->getScheduledEntityUpdates() as $updated) {
$em->remove($updated);
}

$uow->computeChangeSet();
}

要处理批量更新,您可以:

  • 使用 DQL 查询更新您要处理的实体
  • 使用ORMPurger从数据夹具库处理截断表等操作(复制其逻辑或使用具有可用元数据子集和相同连接的第二个实体管理器)
  • 如您所说,直接在连接上工作:您正在进行交易,因此非常安全

请记住,在不更新应用程序级对象的情况下更改数据库状态(大量更新/删除)是一种风险,因此请考虑在此类操作后清除实体管理器。

有一整章关于 transactions, concurrency and locking in the ORM 的文档.据我所知,所有这些操作在 onFlush 期间也是有效的。

关于php - onFlush 事件处理程序中的大量更新和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15158617/

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