【发布时间】:2013-11-17 03:30:56
【问题描述】:
我正在尝试找出在数据库中更新非规范化值的最佳过程。
场景如下:
Scenario: Update Activity Duration
Given the following Task:
| id | name | duration
| 1 | Task 1 | 0
And the following Activity:
| id | name | startedAt | endedAt | task |
| 1 | Activity 1 | 2013-01-01 12:00 | null | 1 |
When I set "Activity 1" endedAt to "2013-01-01 13:00"
And persist "Activity 1"
Then "Activity 1" duration should be 3600
And "Task 1" duration should be 3600
从数据结构可以看出,Task.duration 是 Activity.duration 的反规范化总和。
我正在苦苦挣扎的是何时更新 Activity.duration 和 Task.duration。
Activity.duration 可以在 setEndedAt 方法中计算。
Task.duration 有点棘手。我想当 Activity 被修改时,我需要在 postFlush 事件中重新计算 Task.duration。我假设它必须是 postFlush 因为我想对数据库中的活动持续时间求和,而不是获取所有 Task.acitivities 并在 PHP 中循环它们。
此外,我希望能够一次更新多个活动(想想查看/编辑时间表)。在这种情况下,我认为我需要推迟刷新,以便工作单元包含所有修改后的活动。
文档实际上说:
postFlush 在 EntityManager#flush() 结束时调用。 EntityManager#flush() 不能在其侦听器中安全地调用。
这可能会完全排除这种方法。
建议的解决方案看起来有效吗?我看不到可以在 preFlush 或 onFlush 中完成此操作的方法,因为持续时间尚未保存到数据库中。
干杯李维
【问题讨论】:
标签: symfony doctrine-orm