2012-04-04 48 views
2

比方说,我有两个表:CategoryProductProduct链接到Category与外键Production.categoryId == Category.id。我希望我的数据库服务器负责使用非规范化字段Category.productCount来统计类别内的产品数量 - 触发器将在更新/删除/插入时更新此计数,因此我不必担心它。有没有办法以某种方式与Doctrine2实体同步数据库端触发器?我真的不想在PHP端重新计算这些计数器,因为我们将在多台服务器上运行它。非规范化字段的Doctrine2和数据库端触发器

回答

1

如果我理解您希望能够将新产品添加到某个类别的问题,请坚持它,然后从数据库中更新自己的Category.productCount?您可以使用

$entityManager->refresh($category); 

从数据库重新加载实体。我自己并没有这样做,但我希望你可以使用生命周期功能来自动执行此操作。

但我真的很奇怪,如果只是在本地增加计数器而不坚持它到数据库中会更好。让你的触发器执行数据库操作,但在请求中,本地更新计数器。

+0

这听起来像个好主意,谢谢!我看到的唯一问题是,Doctrine将使用每个插入或更新语句将非规范化字段发送到数据库......有没有一种方法可以告诉Doctrine一个字段在这个意义上是“只读”的?否则,我可以在服务器端有一个触发器,将忽略插入和更新的非规范化计数...这也将工作,我猜;) – KOHb 2012-04-07 23:36:08

+0

我不确定只读。可能会更好地使用更改跟踪策略,例如延迟显式http://docs.doctrine-project.org/projects/doctrine-orm/en/2.1/reference/change-tracking-policies.html,并避免保持类别完全对象。 – Cerad 2012-04-08 11:23:20