使用Doctrine 2和Symfony 2.7我想对数据库中的列使用自动计数。
例:
因此,当我更新报告时,我想将用户(通过OneToMany关系进行报告的父级)添加到排行榜,其中 已完成 设置为 1 (setCompleted)。当用户已经在排行榜上时,我想找到他并添加1 到已完成的任务值。
if (!$lb) { $new = New Leaderboard(); $new->setUsers($user) ->setCompleted('1'); $em->persist($new); } else { $update = $em->getRepository('AppBundle:Leaderboard')->findBy(array('user' => $user)); $update->setCompleted('2'); }
所以基本上我想自动化$update->setCompleted('2');
,以便它获取当前值并向其中添加一个,然后将其刷新到数据库。
我希望这有道理吗?不确定如何解释或在线搜索...
答案 0 :(得分:0)
您可以使用onFlush侦听器来监视报表实体的更新,并根据报表的状态增加/创建排行榜条目。
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#onflush
需要一些(小心)阅读,但它会做你想要的。
这里有几个问题我或多或少地回答了相同的主题,其中的示例可以让您快速入门
Track field changes on Doctrine entity
Persisting other entities inside preUpdate of Doctrine Entity Listener
您想要的基本流程是捕获Report的更新(在我的答案下,更简单的第二个示例显示了为实体完成此操作)。然后根据Report的状态,创建一个新的Leaderboard实体并将其附加到Report,或者更新该报告的现有Leaderboard实体。
请注意,不要刷新实体很重要,只需将其添加到UOW就像这样
$this->getEntityManager()->persist($entity);
$metaData = $this->getEntityManager()->getClassMetadata($className);
$this->getUnitOfWork()->computeChangeSet($metaData, $entity);
希望有所帮助!